summaryrefslogtreecommitdiffstats
path: root/ui/qt/gsm_map_summary_dialog.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /ui/qt/gsm_map_summary_dialog.cpp
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ui/qt/gsm_map_summary_dialog.cpp')
-rw-r--r--ui/qt/gsm_map_summary_dialog.cpp385
1 files changed, 385 insertions, 0 deletions
diff --git a/ui/qt/gsm_map_summary_dialog.cpp b/ui/qt/gsm_map_summary_dialog.cpp
new file mode 100644
index 0000000..3652c7c
--- /dev/null
+++ b/ui/qt/gsm_map_summary_dialog.cpp
@@ -0,0 +1,385 @@
+/* gsm_map_summary_dialog.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "gsm_map_summary_dialog.h"
+#include <ui_gsm_map_summary_dialog.h>
+
+#include "config.h"
+
+#include <glib.h>
+
+#include "ui/summary.h"
+
+#include <epan/packet.h>
+#include <epan/tap.h>
+#include <epan/asn1.h>
+#include <epan/dissectors/packet-gsm_map.h>
+
+#include "wsutil/utf8_entities.h"
+
+#include "ui/capture_globals.h"
+#include "ui/simple_dialog.h"
+
+#include <ui/qt/utils/qt_ui_utils.h>
+#include "main_application.h"
+
+#include <QTextStream>
+
+/** 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;
+
+GsmMapSummaryDialog::GsmMapSummaryDialog(QWidget &parent, CaptureFile &capture_file) :
+ WiresharkDialog(parent, capture_file),
+ ui(new Ui::GsmMapSummaryDialog)
+{
+ ui->setupUi(this);
+
+ setWindowSubtitle(tr("GSM MAP Summary"));
+ updateWidgets();
+}
+
+GsmMapSummaryDialog::~GsmMapSummaryDialog()
+{
+ delete ui;
+}
+
+// Copied from capture_file_properties_dialog.cpp
+QString GsmMapSummaryDialog::summaryToHtml()
+{
+ summary_tally summary;
+ memset(&summary, 0, sizeof(summary_tally));
+
+ QString section_tmpl;
+ QString table_begin, table_end;
+ QString table_row_begin, table_ul_row_begin, table_row_end;
+ QString table_vheader_tmpl;
+ QString table_data_tmpl;
+
+ section_tmpl = "<p><strong>%1</strong></p>\n";
+ table_begin = "<p><table>\n";
+ table_end = "</table></p>\n";
+ table_row_begin = "<tr>\n";
+ table_ul_row_begin = "<tr style=\"border-bottom: 1px solid gray;\">\n";
+ table_row_end = "</tr>\n";
+ table_vheader_tmpl = "<td width=\"50%\">%1:</td>"; // <th align="left"> looked odd
+ table_data_tmpl = "<td>%1</td>";
+
+ if (cap_file_.isValid()) {
+ /* initial computations */
+ summary_fill_in(cap_file_.capFile(), &summary);
+#ifdef HAVE_LIBPCAP
+ summary_fill_in_capture(cap_file_.capFile(), &global_capture_opts, &summary);
+#endif
+ }
+
+ QString summary_str;
+ QTextStream out(&summary_str);
+
+ // File Section
+ out << section_tmpl.arg(tr("File"));
+ out << table_begin;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Name"))
+ << table_data_tmpl.arg(summary.filename)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Length"))
+ << table_data_tmpl.arg(file_size_to_qstring(summary.file_length))
+ << table_row_end;
+
+ QString format_str = wtap_file_type_subtype_description(summary.file_type);
+ const char *compression_type_description = wtap_compression_type_description(summary.compression_type);
+ if (compression_type_description != NULL) {
+ format_str += QString(" (%1)").arg(compression_type_description);
+ }
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Format"))
+ << table_data_tmpl.arg(format_str)
+ << table_row_end;
+
+ if (summary.snap != 0) {
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Snapshot length"))
+ << table_data_tmpl.arg(summary.snap)
+ << table_row_end;
+ }
+
+ out << table_end;
+
+ // Data Section
+ out << section_tmpl.arg(tr("Data"));
+ out << table_begin;
+
+ if (summary.packet_count_ts == summary.packet_count &&
+ summary.packet_count >= 1)
+ {
+ // start time
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("First packet"))
+ << table_data_tmpl.arg(time_t_to_qstring((time_t)summary.start_time))
+ << table_row_end;
+
+ // stop time
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Last packet"))
+ << table_data_tmpl.arg(time_t_to_qstring((time_t)summary.stop_time))
+ << table_row_end;
+
+ // elapsed seconds (capture duration)
+ if (summary.packet_count_ts > 1)
+ {
+ /* elapsed seconds */
+ QString elapsed_str;
+ unsigned int elapsed_time = (unsigned int)summary.elapsed_time;
+ if (elapsed_time/86400)
+ {
+ elapsed_str = QString("%1 days ").arg(elapsed_time / 86400);
+ }
+
+ elapsed_str += QString("%1:%2:%3")
+ .arg(elapsed_time % 86400 / 3600, 2, 10, QChar('0'))
+ .arg(elapsed_time % 3600 / 60, 2, 10, QChar('0'))
+ .arg(elapsed_time % 60, 2, 10, QChar('0'));
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Elapsed"))
+ << table_data_tmpl.arg(elapsed_str)
+ << table_row_end;
+ }
+ }
+
+ // count
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Packets"))
+ << table_data_tmpl.arg(summary.packet_count)
+ << table_row_end;
+
+ out << table_end;
+
+ QString n_a = UTF8_EM_DASH;
+ QString invoke_rate_str, result_rate_str, total_rate_str;
+ QString invoke_avg_size_str, result_avg_size_str, total_avg_size_str;
+
+ // Message averages
+ invoke_rate_str = result_rate_str = total_rate_str = n_a;
+ invoke_avg_size_str = result_avg_size_str = total_avg_size_str = n_a;
+
+ double seconds = summary.stop_time - summary.start_time;
+ int invoke_count = 0, invoke_bytes = 0;
+ int result_count = 0, result_bytes = 0;
+
+ for (int i = 0; i < GSM_MAP_MAX_NUM_OPR_CODES; i++) {
+ invoke_count += gsm_map_stat.opr_code[i];
+ invoke_bytes += gsm_map_stat.size[i];
+ }
+
+
+ for (int i = 0; i < GSM_MAP_MAX_NUM_OPR_CODES; i++) {
+ result_count += gsm_map_stat.opr_code_rr[i];
+ result_bytes += gsm_map_stat.size_rr[i];
+ }
+
+ int total_count = invoke_count + result_count;
+ int total_bytes = invoke_bytes + result_bytes;
+
+ /*
+ * 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 > 1 && seconds > 0.0) {
+ /* Total number of invokes per second */
+ invoke_rate_str = QString("%1").arg(invoke_count / seconds, 1, 'f', 1);
+ result_rate_str = QString("%1").arg(result_count / seconds, 1, 'f', 1);
+ total_rate_str = QString("%1").arg((total_count) / seconds, 1, 'f', 1);
+ }
+
+ /* Average message sizes */
+ if (invoke_count > 0) {
+ invoke_avg_size_str = QString("%1").arg((double) invoke_bytes / invoke_count, 1, 'f', 1);
+ }
+ if (result_count > 0) {
+ result_avg_size_str = QString("%1").arg((double) result_bytes / result_count, 1, 'f', 1);
+ }
+ if (total_count > 0) {
+ total_avg_size_str = QString("%1").arg((double) total_bytes / total_count, 1, 'f', 1);
+ }
+
+ // Invoke Section
+ out << section_tmpl.arg(tr("Invokes"));
+ out << table_begin;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of Invokes"))
+ << table_data_tmpl.arg(invoke_count)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of Invokes per second"))
+ << table_data_tmpl.arg(invoke_rate_str)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of bytes for Invokes"))
+ << table_data_tmpl.arg(invoke_bytes)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of bytes per Invoke"))
+ << table_data_tmpl.arg(invoke_avg_size_str)
+ << table_row_end;
+
+ out << table_end;
+
+ // Return Result Section
+ out << section_tmpl.arg(tr("Return Results"));
+ out << table_begin;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of Return Results"))
+ << table_data_tmpl.arg(result_count)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of Return Results per second"))
+ << table_data_tmpl.arg(result_rate_str)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of bytes for Return Results"))
+ << table_data_tmpl.arg(result_bytes)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of bytes per Return Result"))
+ << table_data_tmpl.arg(result_avg_size_str)
+ << table_row_end;
+
+ out << table_end;
+
+ // Total Section
+ out << section_tmpl.arg(tr("Totals"));
+ out << table_begin;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of GSM MAP messages"))
+ << table_data_tmpl.arg(total_count)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of GSM MAP messages per second"))
+ << table_data_tmpl.arg(total_rate_str)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Total number of bytes for GSM MAP messages"))
+ << table_data_tmpl.arg(total_bytes)
+ << table_row_end;
+
+ out << table_row_begin
+ << table_vheader_tmpl.arg(tr("Average number of bytes per GSM MAP message"))
+ << table_data_tmpl.arg(total_avg_size_str)
+ << table_row_end;
+
+ out << table_end;
+
+ return summary_str;
+}
+
+void GsmMapSummaryDialog::updateWidgets()
+{
+// QPushButton *refresh_bt = ui->buttonBox->button(QDialogButtonBox::Reset);
+// QPushButton *save_bt = ui->buttonBox->button(QDialogButtonBox::Save);
+
+// if (file_closed_) {
+// if (refresh_bt) {
+// refresh_bt->setEnabled(false);
+// }
+// ui->commentsTextEdit->setReadOnly(true);
+// if (save_bt) {
+// save_bt->setEnabled(false);
+// }
+// return;
+// }
+
+ ui->summaryTextEdit->setHtml(summaryToHtml());
+
+ WiresharkDialog::updateWidgets();
+}
+
+extern "C" {
+
+void register_tap_listener_qt_gsm_map_summary(void);
+
+static void
+gsm_map_summary_reset(void *tapdata)
+{
+ gsm_map_stat_t *gm_stat = (gsm_map_stat_t *)tapdata;
+
+ memset(gm_stat, 0, sizeof(gsm_map_stat_t));
+}
+
+
+static tap_packet_status
+gsm_map_summary_packet(void *tapdata, packet_info *, epan_dissect_t *, const void *gmtr_ptr, tap_flags_t flags _U_)
+{
+ gsm_map_stat_t *gm_stat = (gsm_map_stat_t *)tapdata;
+ const gsm_map_tap_rec_t *gm_tap_rec = (const gsm_map_tap_rec_t *)gmtr_ptr;
+
+ if (gm_tap_rec->invoke)
+ {
+ gm_stat->opr_code[gm_tap_rec->opcode]++;
+ gm_stat->size[gm_tap_rec->opcode] += gm_tap_rec->size;
+ }
+ else
+ {
+ gm_stat->opr_code_rr[gm_tap_rec->opcode]++;
+ gm_stat->size_rr[gm_tap_rec->opcode] += gm_tap_rec->size;
+ }
+
+ return(TAP_PACKET_DONT_REDRAW); /* We have no draw callback */
+}
+
+void
+register_tap_listener_qt_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,
+ 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);
+ }
+}
+
+} // extern "C"