1 /* packet_range_group_box.cpp
2 *
3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include "packet_range_group_box.h"
11 #include <ui_packet_range_group_box.h>
12 #include <wsutil/ws_assert.h>
13
PacketRangeGroupBox(QWidget * parent)14 PacketRangeGroupBox::PacketRangeGroupBox(QWidget *parent) :
15 QGroupBox(parent),
16 pr_ui_(new Ui::PacketRangeGroupBox),
17 range_(NULL),
18 syntax_state_(SyntaxLineEdit::Empty)
19 {
20 pr_ui_->setupUi(this);
21 setFlat(true);
22
23 pr_ui_->displayedButton->setChecked(true);
24 pr_ui_->allButton->setChecked(true);
25 }
26
~PacketRangeGroupBox()27 PacketRangeGroupBox::~PacketRangeGroupBox()
28 {
29 delete pr_ui_;
30 }
31
initRange(packet_range_t * range,QString selRange)32 void PacketRangeGroupBox::initRange(packet_range_t *range, QString selRange) {
33 if (!range) return;
34
35 range_ = range;
36
37 if (range_->process_filtered) {
38 pr_ui_->displayedButton->setChecked(true);
39 } else {
40 pr_ui_->capturedButton->setChecked(true);
41 }
42
43 if (selRange.length() > 0)
44 packet_range_convert_selection_str(range_, selRange.toUtf8().constData());
45
46 if (range_->user_range) {
47 char* tmp_str = range_convert_range(NULL, range_->user_range);
48 pr_ui_->rangeLineEdit->setText(tmp_str);
49 wmem_free(NULL, tmp_str);
50 }
51 updateCounts();
52 }
53
isValid()54 bool PacketRangeGroupBox::isValid() {
55 if (pr_ui_->rangeButton->isChecked() && syntax_state_ != SyntaxLineEdit::Empty) {
56 return false;
57 }
58 return true;
59 }
60
updateCounts()61 void PacketRangeGroupBox::updateCounts() {
62 SyntaxLineEdit::SyntaxState orig_ss = syntax_state_;
63 bool displayed_checked = pr_ui_->displayedButton->isChecked();
64 bool can_select;
65 bool selected_packets;
66 int ignored_cnt = 0, displayed_ignored_cnt = 0;
67 int label_count;
68
69 if (!range_ || !range_->cf) return;
70
71 if (range_->displayed_cnt != 0) {
72 pr_ui_->displayedButton->setEnabled(true);
73 } else {
74 displayed_checked = false;
75 pr_ui_->capturedButton->setChecked(true);
76 pr_ui_->displayedButton->setEnabled(false);
77 }
78
79 // All / Captured
80 pr_ui_->allCapturedLabel->setEnabled(!displayed_checked);
81 label_count = range_->cf->count;
82 if (range_->remove_ignored) {
83 label_count -= range_->ignored_cnt;
84 }
85 pr_ui_->allCapturedLabel->setText(QString("%1").arg(label_count));
86
87 // All / Displayed
88 pr_ui_->allDisplayedLabel->setEnabled(displayed_checked);
89 if (range_->include_dependents) {
90 label_count = range_->displayed_plus_dependents_cnt;
91 } else {
92 label_count = range_->displayed_cnt;
93 }
94 if (range_->remove_ignored) {
95 label_count -= range_->displayed_ignored_cnt;
96 }
97 pr_ui_->allDisplayedLabel->setText(QString("%1").arg(label_count));
98
99 // Selected / Captured + Displayed
100 can_select = (range_->selection_range_cnt > 0 || range_->displayed_selection_range_cnt > 0);
101 if (can_select) {
102 pr_ui_->selectedButton->setEnabled(true);
103 pr_ui_->selectedCapturedLabel->setEnabled(!displayed_checked);
104 pr_ui_->selectedDisplayedLabel->setEnabled(displayed_checked);
105
106 pr_ui_->selectedCapturedLabel->setText(QString::number(range_->selection_range_cnt));
107 pr_ui_->selectedDisplayedLabel->setText(QString::number(range_->displayed_selection_range_cnt));
108 } else {
109 if (range_->process == range_process_selected) {
110 pr_ui_->allButton->setChecked(true);
111 }
112 pr_ui_->selectedButton->setEnabled(false);
113 pr_ui_->selectedCapturedLabel->setEnabled(false);
114 pr_ui_->selectedDisplayedLabel->setEnabled(false);
115
116 pr_ui_->selectedCapturedLabel->setText("0");
117 pr_ui_->selectedDisplayedLabel->setText("0");
118 }
119
120 // Marked / Captured + Displayed
121 if (displayed_checked) {
122 selected_packets = (range_->displayed_marked_cnt != 0);
123 } else {
124 selected_packets = (range_->cf->marked_count > 0);
125 }
126 if (selected_packets) {
127 pr_ui_->markedButton->setEnabled(true);
128 pr_ui_->markedCapturedLabel->setEnabled(!displayed_checked);
129 pr_ui_->markedDisplayedLabel->setEnabled(displayed_checked);
130 } else {
131 if (range_->process == range_process_marked) {
132 pr_ui_->allButton->setChecked(true);
133 }
134 pr_ui_->markedButton->setEnabled(false);
135 pr_ui_->markedCapturedLabel->setEnabled(false);
136 pr_ui_->markedDisplayedLabel->setEnabled(false);
137 }
138 label_count = range_->cf->marked_count;
139 if (range_->remove_ignored) {
140 label_count -= range_->ignored_marked_cnt;
141 }
142 pr_ui_->markedCapturedLabel->setText(QString("%1").arg(label_count));
143 label_count = range_->cf->marked_count;
144 if (range_->remove_ignored) {
145 label_count -= range_->displayed_ignored_marked_cnt;
146 }
147 pr_ui_->markedDisplayedLabel->setText(QString("%1").arg(label_count));
148
149 // First to last marked / Captured + Displayed
150 if (displayed_checked) {
151 selected_packets = (range_->displayed_mark_range_cnt != 0);
152 } else {
153 selected_packets = (range_->mark_range_cnt != 0);
154 }
155 if (selected_packets) {
156 pr_ui_->ftlMarkedButton->setEnabled(true);
157 pr_ui_->ftlCapturedLabel->setEnabled(!displayed_checked);
158 pr_ui_->ftlDisplayedLabel->setEnabled(displayed_checked);
159 } else {
160 if (range_->process == range_process_marked_range) {
161 pr_ui_->allButton->setChecked(true);
162 }
163 pr_ui_->ftlMarkedButton->setEnabled(false);
164 pr_ui_->ftlCapturedLabel->setEnabled(false);
165 pr_ui_->ftlDisplayedLabel->setEnabled(false);
166 }
167 label_count = range_->mark_range_cnt;
168 if (range_->remove_ignored) {
169 label_count -= range_->ignored_mark_range_cnt;
170 }
171 pr_ui_->ftlCapturedLabel->setText(QString("%1").arg(label_count));
172 label_count = range_->displayed_mark_range_cnt;
173 if (range_->remove_ignored) {
174 label_count -= range_->displayed_ignored_mark_range_cnt;
175 }
176 pr_ui_->ftlDisplayedLabel->setText(QString("%1").arg(label_count));
177
178 // User specified / Captured + Displayed
179
180 pr_ui_->rangeButton->setEnabled(true);
181 pr_ui_->rangeCapturedLabel->setEnabled(!displayed_checked);
182 pr_ui_->rangeDisplayedLabel->setEnabled(displayed_checked);
183
184 packet_range_convert_str(range_, pr_ui_->rangeLineEdit->text().toUtf8().constData());
185
186 switch (packet_range_check(range_)) {
187
188 case CVT_NO_ERROR:
189 label_count = range_->user_range_cnt;
190 if (range_->remove_ignored) {
191 label_count -= range_->ignored_user_range_cnt;
192 }
193 pr_ui_->rangeCapturedLabel->setText(QString("%1").arg(label_count));
194 label_count = range_->displayed_user_range_cnt;
195 if (range_->remove_ignored) {
196 label_count -= range_->displayed_ignored_user_range_cnt;
197 }
198 pr_ui_->rangeDisplayedLabel->setText(QString("%1").arg(label_count));
199 syntax_state_ = SyntaxLineEdit::Empty;
200 break;
201
202 case CVT_SYNTAX_ERROR:
203 pr_ui_->rangeCapturedLabel->setText("<small><i>Bad range</i></small>");
204 pr_ui_->rangeDisplayedLabel->setText("-");
205 syntax_state_ = SyntaxLineEdit::Invalid;
206 break;
207
208 case CVT_NUMBER_TOO_BIG:
209 pr_ui_->rangeCapturedLabel->setText("<small><i>Number too large</i></small>");
210 pr_ui_->rangeDisplayedLabel->setText("-");
211 syntax_state_ = SyntaxLineEdit::Invalid;
212 break;
213
214 default:
215 ws_assert_not_reached();
216 return;
217 }
218
219 // Ignored
220 switch(range_->process) {
221 case(range_process_all):
222 ignored_cnt = range_->ignored_cnt;
223 displayed_ignored_cnt = range_->displayed_ignored_cnt;
224 break;
225 case(range_process_selected):
226 ignored_cnt = range_->ignored_selection_range_cnt;
227 displayed_ignored_cnt = range_->displayed_ignored_selection_range_cnt;
228 break;
229 case(range_process_marked):
230 ignored_cnt = range_->ignored_marked_cnt;
231 displayed_ignored_cnt = range_->displayed_ignored_marked_cnt;
232 break;
233 case(range_process_marked_range):
234 ignored_cnt = range_->ignored_mark_range_cnt;
235 displayed_ignored_cnt = range_->displayed_ignored_mark_range_cnt;
236 break;
237 case(range_process_user_range):
238 ignored_cnt = range_->ignored_user_range_cnt;
239 displayed_ignored_cnt = range_->displayed_ignored_user_range_cnt;
240 break;
241 default:
242 ws_assert_not_reached();
243 }
244
245 if (displayed_checked)
246 selected_packets = (displayed_ignored_cnt != 0);
247 else
248 selected_packets = (ignored_cnt != 0);
249
250 if (selected_packets) {
251 pr_ui_->ignoredCheckBox->setEnabled(true);
252 pr_ui_->ignoredCapturedLabel->setEnabled(!displayed_checked);
253 pr_ui_->ignoredDisplayedLabel->setEnabled(displayed_checked);
254 } else {
255 pr_ui_->ignoredCheckBox->setEnabled(false);
256 pr_ui_->ignoredCapturedLabel->setEnabled(false);
257 pr_ui_->ignoredDisplayedLabel->setEnabled(false);
258 }
259 pr_ui_->ignoredCapturedLabel->setText(QString("%1").arg(ignored_cnt));
260 pr_ui_->ignoredDisplayedLabel->setText(QString("%1").arg(displayed_ignored_cnt));
261
262 if (orig_ss != syntax_state_) {
263 pr_ui_->rangeLineEdit->setSyntaxState(syntax_state_);
264 emit validityChanged(isValid());
265 }
266 emit rangeChanged();
267 }
268
269 // Slots
270
on_rangeLineEdit_textChanged(const QString &)271 void PacketRangeGroupBox::on_rangeLineEdit_textChanged(const QString &)
272 {
273 if (!pr_ui_->rangeButton->isChecked()) {
274 pr_ui_->rangeButton->setChecked(true);
275 } else {
276 updateCounts();
277 }
278 }
279
processButtonToggled(bool checked,packet_range_e process)280 void PacketRangeGroupBox::processButtonToggled(bool checked, packet_range_e process) {
281 if (checked && range_) {
282 range_->process = process;
283 }
284 updateCounts();
285 }
286
on_allButton_toggled(bool checked)287 void PacketRangeGroupBox::on_allButton_toggled(bool checked)
288 {
289 processButtonToggled(checked, range_process_all);
290 }
291
on_selectedButton_toggled(bool checked)292 void PacketRangeGroupBox::on_selectedButton_toggled(bool checked)
293 {
294 processButtonToggled(checked, range_process_selected);
295 }
296
on_markedButton_toggled(bool checked)297 void PacketRangeGroupBox::on_markedButton_toggled(bool checked)
298 {
299 processButtonToggled(checked, range_process_marked);
300 }
301
on_ftlMarkedButton_toggled(bool checked)302 void PacketRangeGroupBox::on_ftlMarkedButton_toggled(bool checked)
303 {
304 processButtonToggled(checked, range_process_marked_range);
305 }
306
on_rangeButton_toggled(bool checked)307 void PacketRangeGroupBox::on_rangeButton_toggled(bool checked)
308 {
309 processButtonToggled(checked, range_process_user_range);
310 }
311
on_capturedButton_toggled(bool checked)312 void PacketRangeGroupBox::on_capturedButton_toggled(bool checked)
313 {
314 if (checked) {
315 if (range_) range_->process_filtered = FALSE;
316 updateCounts();
317 }
318 }
319
on_displayedButton_toggled(bool checked)320 void PacketRangeGroupBox::on_displayedButton_toggled(bool checked)
321 {
322 if (checked) {
323 if (range_) range_->process_filtered = TRUE;
324 updateCounts();
325 }
326 }
327
on_ignoredCheckBox_toggled(bool checked)328 void PacketRangeGroupBox::on_ignoredCheckBox_toggled(bool checked)
329 {
330 if (range_) range_->remove_ignored = checked ? TRUE : FALSE;
331 updateCounts();
332 }
333