aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt/main_window_slots.cpp
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2016-03-18 10:34:41 -0700
committerGerald Combs <gerald@wireshark.org>2016-03-28 16:27:41 +0000
commit6931f581f90d272474b47d4a4606bb93183f449a (patch)
tree08ff02c43d1896ea1d5e14bf28cd9288156e91c8 /ui/qt/main_window_slots.cpp
parent7e5dae90d65ed062f2d01c63174cc1c94850a19a (diff)
Qt: Make conversation menu items static.
Add a ConversationAction and ColorizeAction classes which respectively handle conversation filtering and colorization. Move conversation menu initialization to initConversationMenus and call it once at startup. This keeps us from leaking quite a bit of memory each time we select a packet or proto tree item. Bug: 12044 Change-Id: I32e8cedaba08a419d5da6a7a9db31c910909f450 Reviewed-on: https://code.wireshark.org/review/14516 Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'ui/qt/main_window_slots.cpp')
-rw-r--r--ui/qt/main_window_slots.cpp139
1 files changed, 39 insertions, 100 deletions
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index f535e70634..83c7d8149e 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -44,9 +44,9 @@
#include "wsutil/filesystem.h"
#include "epan/addr_resolv.h"
-#include "epan/dissector_filters.h"
#include "epan/column.h"
#include "epan/dfilter/dfilter-macro.h"
+#include "epan/dissector_filters.h"
#include "epan/epan_dissect.h"
#include "epan/filter_expressions.h"
#include "epan/prefs.h"
@@ -86,6 +86,7 @@
#include "color_utils.h"
#include "coloring_rules_dialog.h"
#include "conversation_dialog.h"
+#include "conversation_colorize_action.h"
#include "conversation_hash_tables_dialog.h"
#include "enabled_protocols_dialog.h"
#include "decode_as_dialog.h"
@@ -157,9 +158,6 @@
static const char *dfe_property_ = "display filter expression"; //TODO : Fix Translate
-// We're too lazy to sublcass QAction.
-static const char *color_number_property_ = "color number";
-
bool MainWindow::openCaptureFile(QString cf_path, QString read_filter, unsigned int type)
{
QString file_name = "";
@@ -1159,44 +1157,7 @@ void MainWindow::setMenusForSelectedPacket()
main_ui_->actionViewShowPacketInNewWindow->setEnabled(frame_selected);
main_ui_->actionViewEditResolvedName->setEnabled(frame_selected && is_ip);
- main_ui_->menuConversationFilter->clear();
-
- packet_list_->conversationMenu()->clear();
- packet_list_->colorizeMenu()->clear();
-
- for (GList *conv_filter_list_entry = conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = g_list_next(conv_filter_list_entry)) {
- // Main menu items
- conversation_filter_t* conv_filter = (conversation_filter_t *)conv_filter_list_entry->data;
- QAction *conv_action = main_ui_->menuConversationFilter->addAction(conv_filter->display_name);
-
- bool enable = false;
- QString filter;
- if (capture_file_.capFile() && capture_file_.capFile()->edt) {
- enable = conv_filter->is_filter_valid(&capture_file_.capFile()->edt->pi);
- filter = gchar_free_to_qstring(conv_filter->build_filter_string(&capture_file_.capFile()->edt->pi));
- }
- conv_action->setEnabled(enable);
- conv_action->setData(filter);
- connect(conv_action, SIGNAL(triggered()), this, SLOT(applyConversationFilter()));
-
- // Packet list context menu items
- packet_list_->conversationMenu()->addAction(conv_action);
-
- QMenu *submenu = packet_list_->colorizeMenu()->addMenu(conv_action->text());
- int i = 1;
- foreach (QAction *cc_action, cc_actions) {
- QAction *colorize_action = submenu->addAction(cc_action->icon(), cc_action->text());
- colorize_action->setProperty(color_number_property_, i++);
- colorize_action->setData(filter);
- colorize_action->setEnabled(enable);
- connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
- }
-
- QAction *conv_rule_action = submenu->addAction(main_ui_->actionViewColorizeNewColoringRule->text());
- conv_rule_action->setData(conv_action->data());
- conv_rule_action->setEnabled(enable);
- connect(conv_rule_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
- }
+ emit packetInfoChanged(capture_file_.packetInfo());
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/NameResolution/ResolveName",
// frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
@@ -1218,16 +1179,9 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
bool have_field_info = false;
bool have_subtree = false;
bool can_open_url = false;
- QString field_filter;
+ QByteArray field_filter;
int field_id = -1;
- QList<QAction *> cc_actions = QList<QAction *>()
- << main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2
- << main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4
- << main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6
- << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8
- << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10;
-
if (capture_file_.capFile()) {
capture_file_.capFile()->finfo_selected = fi;
@@ -1248,7 +1202,7 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
}
char *tmp_field = proto_construct_match_selected_string(fi, capture_file_.capFile()->edt);
- field_filter = QString(tmp_field);
+ field_filter = tmp_field;
wmem_free(NULL, tmp_field);
field_id = fi->hfinfo->id;
@@ -1299,42 +1253,13 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
// don't clobber anything we may have set in setMenusForSelectedPacket.
if (!proto_tree_ || !proto_tree_->hasFocus()) return;
- main_ui_->menuConversationFilter->clear();
- for (GList *conv_filter_list_entry = conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = g_list_next(conv_filter_list_entry)) {
- conversation_filter_t* conv_filter = (conversation_filter_t *)conv_filter_list_entry->data;
- QAction *conv_action = main_ui_->menuConversationFilter->addAction(conv_filter->display_name);
-
- bool enable = false;
- QString filter;
- if (fi && capture_file_.capFile() && capture_file_.capFile()->edt) {
- enable = conv_filter->is_filter_valid(&capture_file_.capFile()->edt->pi);
- filter = conv_filter->build_filter_string(&capture_file_.capFile()->edt->pi);
- }
- conv_action->setEnabled(enable);
- conv_action->setData(filter);
- connect(conv_action, SIGNAL(triggered()), this, SLOT(applyConversationFilter()));
- }
-
- proto_tree_->colorizeMenu()->clear();
- int i = 1;
- foreach (QAction *cc_action, cc_actions) {
- QAction *colorize_action = proto_tree_->colorizeMenu()->addAction(cc_action->icon(), cc_action->text());
- colorize_action->setProperty(color_number_property_, i++);
- colorize_action->setData(field_filter);
- colorize_action->setEnabled(!field_filter.isEmpty());
- connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
- }
-
- QAction *conv_rule_action = proto_tree_->colorizeMenu()->addAction(main_ui_->actionViewColorizeNewColoringRule->text());
- conv_rule_action->setData(field_filter);
- conv_rule_action->setEnabled(!field_filter.isEmpty());
- connect(conv_rule_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
+ emit packetInfoChanged(capture_file_.packetInfo());
+ emit fieldFilterChanged(field_filter);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ResolveName",
// frame_selected && (gbl_resolv_flags.mac_name || gbl_resolv_flags.network_name ||
// gbl_resolv_flags.transport_name || gbl_resolv_flags.concurrent_dns));
-
main_ui_->actionAnalyzeAAFSelected->setEnabled(can_match_selected);
main_ui_->actionAnalyzeAAFNotSelected->setEnabled(can_match_selected);
main_ui_->actionAnalyzeAAFAndSelected->setEnabled(can_match_selected);
@@ -2303,12 +2228,12 @@ void MainWindow::on_actionViewColoringRules_triggered()
// actionViewColorizeConversation1 - 10
void MainWindow::colorizeConversation(bool create_rule)
{
- QAction *cc_action = qobject_cast<QAction *>(sender());
- if (!cc_action) return;
+ QAction *colorize_action = qobject_cast<QAction *>(sender());
+ if (!colorize_action) return;
if (capture_file_.capFile() && capture_file_.capFile()->current_frame) {
- packet_info *pi = &capture_file_.capFile()->edt->pi;
- guint8 cc_num = cc_action->data().toUInt();
+ packet_info *pi = capture_file_.packetInfo();
+ guint8 cc_num = colorize_action->data().toUInt();
gchar *filter = NULL;
const conversation_filter_t *color_filter = find_conversation_filter("tcp");
@@ -2358,19 +2283,27 @@ void MainWindow::colorizeConversation(bool create_rule)
void MainWindow::colorizeWithFilter()
{
- QAction *colorize_action = qobject_cast<QAction *>(sender());
- if (!colorize_action) return;
+ QByteArray filter;
+ int color_number = -1;
- QString filter = colorize_action->data().toString();
- if (filter.isEmpty()) return;
+ ConversationAction *conv_action = qobject_cast<ConversationAction *>(sender());
+ if (conv_action) {
+ filter = conv_action->filter();
+ color_number = conv_action->colorNumber();
+ } else {
+ ColorizeAction *colorize_action = qobject_cast<ColorizeAction *>(sender());
+ if (colorize_action) {
+ filter = colorize_action->filter();
+ color_number = colorize_action->colorNumber();
+ }
+ }
- bool ok = false;
- int color_number = colorize_action->property(color_number_property_).toInt(&ok);
+ if (filter.isEmpty()) return;
- if (ok) {
+ if (color_number > 0) {
// Assume "Color X"
gchar *err_msg = NULL;
- if (!color_filters_set_tmp(color_number, filter.toUtf8().constData(), FALSE, &err_msg)) {
+ if (!color_filters_set_tmp(color_number, filter.constData(), FALSE, &err_msg)) {
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_msg);
g_free(err_msg);
}
@@ -2570,14 +2503,20 @@ void MainWindow::on_actionAnalyzeCreateAColumn_triggered()
void MainWindow::applyConversationFilter()
{
- QAction *cfa = qobject_cast<QAction*>(sender());
- if (!cfa) return;
+ ConversationAction *conv_action = qobject_cast<ConversationAction*>(sender());
+ if (!conv_action) return;
+
+ packet_info *pinfo = capture_file_.packetInfo();
+ if (!pinfo) return;
+
+ QByteArray conv_filter = conv_action->filter();
+ if (conv_filter.isEmpty()) return;
- QString new_filter = cfa->data().toString();
- if (new_filter.isEmpty()) return;
+ if (conv_action->isFilterValid(pinfo)) {
- df_combo_box_->lineEdit()->setText(new_filter);
- df_combo_box_->applyDisplayFilter();
+ df_combo_box_->lineEdit()->setText(conv_filter);
+ df_combo_box_->applyDisplayFilter();
+ }
}
// XXX We could probably create the analyze and prepare actions