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