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