LATER... ei_kerberos_kdc_session_key ...
[wireshark-sm.git] / ui / qt / conversation_hash_tables_dialog.cpp
blob3d5eff76fbcb7dbcd6450eb96c4da86726599a9f
1 /* conversation_hash_tables_dialog.cpp
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
8 */
10 #include "conversation_hash_tables_dialog.h"
11 #include <ui_conversation_hash_tables_dialog.h>
13 #include "config.h"
15 #include <epan/conversation.h>
16 #include <epan/conversation_debug.h>
18 #include <ui/qt/utils/qt_ui_utils.h>
19 #include "main_application.h"
21 static void
22 fill_named_table(void *key, void *value _U_, void *user_data)
24 const conversation_element_t *elements = static_cast<const conversation_element_t *>(key);
25 QString* html_table = static_cast<QString *>(user_data);
27 if (!elements || !html_table) {
28 return;
31 if (html_table->isEmpty()) {
32 html_table->append("<tr>");
33 int addr_count = 1;
34 int port_count = 1;
35 int string_count = 1;
36 int uint_count = 1;
37 int uint64_count = 1;
38 int int_count = 1;
39 int int64_count = 1;
40 int blob_count = 1;
41 for (const conversation_element_t *cur_el = elements; ; cur_el++) {
42 QString title;
43 switch (cur_el->type) {
44 case CE_ADDRESS:
45 title = QStringLiteral("Address %1").arg(addr_count++);
46 break;
47 case CE_PORT:
48 title = QStringLiteral("Port %1").arg(port_count++);
49 break;
50 case CE_STRING:
51 title = QStringLiteral("String %1").arg(string_count++);
52 break;
53 case CE_UINT:
54 title = QStringLiteral("UInt %1").arg(uint_count++);
55 break;
56 case CE_UINT64:
57 title = QStringLiteral("UInt64 %1").arg(uint64_count++);
58 break;
59 case CE_INT:
60 title = QStringLiteral("Int %1").arg(int_count++);
61 break;
62 case CE_INT64:
63 title = QStringLiteral("Int64 %1").arg(int64_count++);
64 break;
65 case CE_BLOB:
66 title = QStringLiteral("Blob %1").arg(blob_count++);
67 break;
68 case CE_CONVERSATION_TYPE:
69 html_table->append(QStringLiteral("<th>Endpoint</th>"));
70 goto title_done;
71 break;
73 html_table->append(QStringLiteral("<th>%1</th>").arg(title));
75 title_done:
76 html_table->append("</tr>\n");
79 html_table->append("<tr>");
81 for (const conversation_element_t *cur_el = elements; ; cur_el++) {
82 QString val;
83 switch (cur_el->type) {
84 case CE_ADDRESS:
85 val = address_to_qstring(&cur_el->addr_val);
86 break;
87 case CE_PORT:
88 val = QString::number(cur_el->port_val);
89 break;
90 case CE_STRING:
91 val = cur_el->str_val;
92 break;
93 case CE_UINT:
94 val = QString::number(cur_el->uint_val);
95 break;
96 case CE_UINT64:
97 val = QString::number(cur_el->uint64_val);
98 break;
99 case CE_INT:
100 val = QString::number(cur_el->int_val);
101 break;
102 case CE_INT64:
103 val = QString::number(cur_el->int64_val);
104 break;
105 case CE_BLOB:
106 val = QString(QByteArray::fromRawData((const char *)cur_el->blob.val, (int)cur_el->blob.len).toHex());
107 break;
108 case CE_CONVERSATION_TYPE:
109 html_table->append(QStringLiteral("<td>%1</td>").arg(QString::number(cur_el->conversation_type_val)));
110 goto val_done;
111 break;
113 html_table->append(QStringLiteral("<td>%1</td>").arg(val));
115 val_done:
117 html_table->append("</tr>\n");
120 ConversationHashTablesDialog::ConversationHashTablesDialog(QWidget *parent) :
121 GeometryStateDialog(parent),
122 ui(new Ui::ConversationHashTablesDialog)
124 ui->setupUi(this);
125 if (parent) loadGeometry(parent->width() * 3 / 4, parent->height() * 3 / 4);
126 setAttribute(Qt::WA_DeleteOnClose, true);
127 setWindowTitle(mainApp->windowTitleString(tr("Conversation Hash Tables")));
129 QString html;
131 html += "<h2>Conversation Hash Tables</h2>\n";
133 wmem_map_t *conversation_tables = get_conversation_hashtables();
134 wmem_list_t *table_names = wmem_map_get_keys(NULL, conversation_tables);
135 for (wmem_list_frame_t *cur_frame = wmem_list_head(table_names); cur_frame; cur_frame = wmem_list_frame_next(cur_frame))
137 const char *table_name = static_cast<const char *>(wmem_list_frame_data(cur_frame));
138 wmem_map_t *table = static_cast<wmem_map_t *>(wmem_map_lookup(conversation_tables, table_name));
140 if (!table) {
141 html += QStringLiteral("<h3>%1, Error: table not found</h3>\n").arg(table_name);
142 continue;
145 html += QStringLiteral("<h3>%1, %2 entries</h3>\n").arg(table_name).arg(wmem_map_size(table));
146 QString html_table;
147 html += "<table>\n";
148 wmem_map_foreach(table, fill_named_table, &html_table);
149 html += html_table;
150 html += "</table>\n";
152 wmem_destroy_list(table_names);
153 ui->conversationTextEdit->setHtml(html);
156 ConversationHashTablesDialog::~ConversationHashTablesDialog()
158 delete ui;