3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
7 * SPDX-License-Identifier: GPL-2.0-or-later
13 #include "byte_view_tab.h"
14 #include <ui/qt/models/packet_list_model.h>
15 #include "proto_tree.h"
16 #include "protocol_preferences_menu.h"
17 #include <ui/qt/models/related_packet_delegate.h>
18 #include <ui/qt/utils/field_information.h>
25 class PacketListHeader
;
26 class OverlayScrollBar
;
27 class ProfileSwitcher
;
33 // XXX - Wireshark supports up to 2^32-1 packets in a capture, but
34 // row numbers in a QAbstractItemModel are ints, not unsigned ints,
35 // so we can only have 2^31-1 rows on ILP32, LP64, and LLP64 platforms.
36 // Does that mean we're permanently stuck at a maximum of 2^31-1 packets
39 class PacketList
: public QTreeView
43 explicit PacketList(QWidget
*parent
= 0);
46 enum SummaryCopyType
{
52 Q_ENUM(SummaryCopyType
)
54 virtual void scrollTo(const QModelIndex
&index
, QAbstractItemView::ScrollHint hint
= EnsureVisible
) override
;
55 QMenu
*conversationMenu() { return &conv_menu_
; }
56 QMenu
*colorizeMenu() { return &colorize_menu_
; }
57 void setProtoTree(ProtoTree
*proto_tree
);
59 /** Disable and clear the packet list.
61 * @param keep_current_frame If true, keep the selected frame.
62 * Disable packet list widget updates, clear the detail and byte views,
63 * and disconnect the model.
65 bool freeze(bool keep_current_frame
= false);
66 /** Enable and restore the packet list.
68 * Enable packet list widget updates and reconnect the model.
70 * @param restore_selection If true, redissect the previously selected
71 * packet. This includes filling in the detail and byte views.
73 bool thaw(bool restore_selection
= false);
75 void writeRecent(FILE *rf
);
76 bool contextMenuActive();
77 QString
getFilterFromRowAndColumn(QModelIndex idx
);
78 void resetColorized();
79 QString
getPacketComment(unsigned c_number
);
80 void addPacketComment(QString new_comment
);
81 void setPacketComment(unsigned c_number
, QString new_comment
);
82 QString
allPacketComments();
83 void deleteCommentsFromPackets();
84 void deleteAllPacketComments();
85 void setVerticalAutoScroll(bool enabled
= true);
86 void setCaptureInProgress(bool in_progress
= false, bool auto_scroll
= true) { capture_in_progress_
= in_progress
; tail_at_end_
= in_progress
&& auto_scroll
; }
87 void captureFileReadFinished();
89 bool haveNextHistory(bool update_cur
= false);
90 bool havePreviousHistory(bool update_cur
= false);
91 void setProfileSwitcher(ProfileSwitcher
*profile_switcher
);
93 frame_data
* getFDataForRow(int row
) const;
95 bool uniqueSelectActive();
96 bool multiSelectActive();
97 QList
<int> selectedRows(bool useFrameNum
= false);
99 QString
createSummaryText(QModelIndex idx
, SummaryCopyType type
);
100 QString
createHeaderSummaryText(SummaryCopyType type
);
102 QStringList
createHeaderPartsForAligned();
103 QList
<int> createAlignmentPartsForAligned();
104 QList
<int> createSizePartsForAligned(bool useHeader
, QStringList hdr_parts
, QList
<int> rows
);
105 QString
createHeaderSummaryForAligned(QStringList hdr_parts
, QList
<int> align_parts
, QList
<int> size_parts
);
106 QString
createSummaryForAligned(QModelIndex idx
, QList
<int> align_parts
, QList
<int> size_parts
);
108 QString
createDefaultStyleForHtml();
109 QString
createOpeningTagForHtml();
110 QString
createHeaderSummaryForHtml();
111 QString
createSummaryForHtml(QModelIndex idx
);
112 QString
createClosingTagForHtml();
114 void resizeAllColumns(bool onlyTimeFormatted
= false);
118 void selectionChanged(const QItemSelection
& selected
, const QItemSelection
& deselected
) override
;
119 virtual void contextMenuEvent(QContextMenuEvent
*event
) override
;
120 void timerEvent(QTimerEvent
*event
) override
;
121 void paintEvent(QPaintEvent
*event
) override
;
122 virtual void mousePressEvent (QMouseEvent
*event
) override
;
123 virtual void mouseReleaseEvent (QMouseEvent
*event
) override
;
124 virtual void mouseMoveEvent (QMouseEvent
*event
) override
;
125 virtual void resizeEvent(QResizeEvent
*event
) override
;
126 virtual void keyPressEvent(QKeyEvent
*event
) override
;
129 void rowsInserted(const QModelIndex
&parent
, int start
, int end
) override
;
130 virtual void drawRow(QPainter
*painter
, const QStyleOptionViewItem
&option
,
131 const QModelIndex
&index
) const override
;
134 PacketListModel
*packet_list_model_
;
135 PacketListHeader
* packet_list_header_
;
136 ProtoTree
*proto_tree_
;
137 capture_file
*cap_file_
;
139 QMenu colorize_menu_
;
141 QByteArray column_state_
;
142 OverlayScrollBar
*overlay_sb_
;
143 int overlay_timer_id_
;
144 bool create_near_overlay_
;
145 bool create_far_overlay_
;
146 QVector
<QRgb
> overlay_colors_
;
147 bool changing_profile_
;
149 QModelIndex mouse_pressed_at_
;
151 RelatedPacketDelegate related_packet_delegate_
;
152 QAction
*show_hide_separator_
;
153 QList
<QAction
*>show_hide_actions_
;
154 bool capture_in_progress_
;
156 bool columns_changed_
;
157 bool set_column_visibility_
;
158 bool set_style_sheet_
;
159 QModelIndex frozen_current_row_
;
160 QModelIndexList frozen_selected_rows_
;
161 QVector
<int> selection_history_
;
164 GPtrArray
*finfo_array
; // Packet data from the last selected packet entry
165 ProfileSwitcher
*profile_switcher_
;
167 void setFrameReftime(bool set
, frame_data
*fdata
);
168 void setColumnVisibility();
169 int sizeHintForColumn(int column
) const override
;
170 void setRecentColumnWidth(int column
);
171 void drawCurrentPacket();
172 void applyRecentColumnWidths();
173 void scrollViewChanged(bool at_end
);
174 QString
joinSummaryRow(QStringList col_parts
, int row
, SummaryCopyType type
);
177 void packetDissectionChanged();
178 void showColumnPreferences(QString pane_name
);
179 void editColumn(int column
);
180 void packetListScrolled(bool at_end
);
181 void showProtocolPreferences(const QString module_name
);
182 void editProtocolPreference(struct preference
*pref
, struct pref_module
*module
);
184 void framesSelected(QList
<int>);
185 void fieldSelected(FieldInformation
*);
188 void setCaptureFile(capture_file
*cf
);
189 void setMonospaceFont(const QFont
&mono_font
);
190 void setRegularFont(const QFont
®ular_font
);
192 void goPreviousPacket();
193 void goFirstPacket();
195 void goToPacket(int packet
, int hf_id
= -1);
196 void goNextHistoryPacket();
197 void goPreviousHistoryPacket();
199 void markAllDisplayedFrames(bool set
);
201 void ignoreAllDisplayedFrames(bool set
);
202 void setTimeReference();
203 void unsetAllTimeReferences();
204 void applyTimeShift();
205 void recolorPackets();
206 void redrawVisiblePackets();
207 void redrawVisiblePacketsDontSelectCurrent();
208 void colorsChanged();
209 void columnsChanged();
210 void fieldsChanged(capture_file
*cf
);
211 void preferencesChanged();
212 void freezePacketList(bool changing_profile
);
215 void columnVisibilityTriggered();
216 void sectionResized(int col
, int, int new_width
);
217 void sectionMoved(int, int, int);
218 void updateRowHeights(const QModelIndex
&ih_index
);
220 void vScrollBarActionTriggered(int);
221 void drawFarOverlay();
222 void drawNearOverlay();
223 void updatePackets(bool redraw
);
224 void ctxDecodeAsDialog();
227 #endif // PACKET_LIST_H