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
10 #include "conversation_hash_tables_dialog.h"
11 #include <ui_conversation_hash_tables_dialog.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"
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
) {
31 if (html_table
->isEmpty()) {
32 html_table
->append("<tr>");
41 for (const conversation_element_t
*cur_el
= elements
; ; cur_el
++) {
43 switch (cur_el
->type
) {
45 title
= QStringLiteral("Address %1").arg(addr_count
++);
48 title
= QStringLiteral("Port %1").arg(port_count
++);
51 title
= QStringLiteral("String %1").arg(string_count
++);
54 title
= QStringLiteral("UInt %1").arg(uint_count
++);
57 title
= QStringLiteral("UInt64 %1").arg(uint64_count
++);
60 title
= QStringLiteral("Int %1").arg(int_count
++);
63 title
= QStringLiteral("Int64 %1").arg(int64_count
++);
66 title
= QStringLiteral("Blob %1").arg(blob_count
++);
68 case CE_CONVERSATION_TYPE
:
69 html_table
->append(QStringLiteral("<th>Endpoint</th>"));
73 html_table
->append(QStringLiteral("<th>%1</th>").arg(title
));
76 html_table
->append("</tr>\n");
79 html_table
->append("<tr>");
81 for (const conversation_element_t
*cur_el
= elements
; ; cur_el
++) {
83 switch (cur_el
->type
) {
85 val
= address_to_qstring(&cur_el
->addr_val
);
88 val
= QString::number(cur_el
->port_val
);
91 val
= cur_el
->str_val
;
94 val
= QString::number(cur_el
->uint_val
);
97 val
= QString::number(cur_el
->uint64_val
);
100 val
= QString::number(cur_el
->int_val
);
103 val
= QString::number(cur_el
->int64_val
);
106 val
= QString(QByteArray::fromRawData((const char *)cur_el
->blob
.val
, (int)cur_el
->blob
.len
).toHex());
108 case CE_CONVERSATION_TYPE
:
109 html_table
->append(QStringLiteral("<td>%1</td>").arg(QString::number(cur_el
->conversation_type_val
)));
113 html_table
->append(QStringLiteral("<td>%1</td>").arg(val
));
117 html_table
->append("</tr>\n");
120 ConversationHashTablesDialog::ConversationHashTablesDialog(QWidget
*parent
) :
121 GeometryStateDialog(parent
),
122 ui(new Ui::ConversationHashTablesDialog
)
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")));
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
));
141 html
+= QStringLiteral("<h3>%1, Error: table not found</h3>\n").arg(table_name
);
145 html
+= QStringLiteral("<h3>%1, %2 entries</h3>\n").arg(table_name
).arg(wmem_map_size(table
));
148 wmem_map_foreach(table
, fill_named_table
, &html_table
);
150 html
+= "</table>\n";
152 wmem_destroy_list(table_names
);
153 ui
->conversationTextEdit
->setHtml(html
);
156 ConversationHashTablesDialog::~ConversationHashTablesDialog()