aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt
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
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')
-rw-r--r--ui/qt/CMakeLists.txt2
-rw-r--r--ui/qt/Makefile.common2
-rw-r--r--ui/qt/Wireshark.pro2
-rw-r--r--ui/qt/capture_file.cpp10
-rw-r--r--ui/qt/capture_file.h8
-rw-r--r--ui/qt/conversation_colorize_action.cpp80
-rw-r--r--ui/qt/conversation_colorize_action.h90
-rw-r--r--ui/qt/main_window.cpp69
-rw-r--r--ui/qt/main_window.h3
-rw-r--r--ui/qt/main_window_slots.cpp139
-rw-r--r--ui/qt/proto_tree.cpp1
-rw-r--r--ui/qt/qt_ui_utils.cpp9
-rw-r--r--ui/qt/qt_ui_utils.h9
13 files changed, 321 insertions, 103 deletions
diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt
index b3f409421e..3b56e65dea 100644
--- a/ui/qt/CMakeLists.txt
+++ b/ui/qt/CMakeLists.txt
@@ -45,6 +45,7 @@ set(WIRESHARK_QT_HEADERS
column_preferences_frame.h
column_editor_frame.h
compiled_filter_output.h
+ conversation_colorize_action.h
conversation_dialog.h
conversation_hash_tables_dialog.h
decode_as_dialog.h
@@ -199,6 +200,7 @@ set(WIRESHARK_QT_SRC
column_preferences_frame.cpp
column_editor_frame.cpp
compiled_filter_output.cpp
+ conversation_colorize_action.cpp
conversation_dialog.cpp
conversation_hash_tables_dialog.cpp
decode_as_dialog.cpp
diff --git a/ui/qt/Makefile.common b/ui/qt/Makefile.common
index 469850ca1e..c091dab3f4 100644
--- a/ui/qt/Makefile.common
+++ b/ui/qt/Makefile.common
@@ -165,6 +165,7 @@ MOC_HDRS = \
column_preferences_frame.h \
column_editor_frame.h \
compiled_filter_output.h \
+ conversation_colorize_action.h \
conversation_dialog.h \
conversation_hash_tables_dialog.h \
decode_as_dialog.h \
@@ -432,6 +433,7 @@ WIRESHARK_QT_SRC = \
column_preferences_frame.cpp \
column_editor_frame.cpp \
compiled_filter_output.cpp \
+ conversation_colorize_action.cpp \
conversation_dialog.cpp \
conversation_hash_tables_dialog.cpp \
decode_as_dialog.cpp \
diff --git a/ui/qt/Wireshark.pro b/ui/qt/Wireshark.pro
index b271866798..555c668781 100644
--- a/ui/qt/Wireshark.pro
+++ b/ui/qt/Wireshark.pro
@@ -302,6 +302,7 @@ HEADERS += $$HEADERS_WS_C \
column_preferences_frame.h \
column_editor_frame.h \
compiled_filter_output.h \
+ conversation_colorize_action.h \
conversation_dialog.h \
conversation_hash_tables_dialog.h \
decode_as_dialog.h \
@@ -692,6 +693,7 @@ SOURCES += \
column_preferences_frame.cpp \
column_editor_frame.cpp \
compiled_filter_output.cpp \
+ conversation_colorize_action.cpp \
conversation_dialog.cpp \
conversation_hash_tables_dialog.cpp \
decode_as_dialog.cpp \
diff --git a/ui/qt/capture_file.cpp b/ui/qt/capture_file.cpp
index fb5566ecce..77f83fb05c 100644
--- a/ui/qt/capture_file.cpp
+++ b/ui/qt/capture_file.cpp
@@ -33,6 +33,8 @@ capture_file cfile;
#include "file.h"
#include "log.h"
+#include "epan/epan_dissect.h"
+
#include "ui/capture.h"
#include <QFileInfo>
@@ -89,6 +91,14 @@ const QString CaptureFile::fileName()
return file_name_;
}
+struct _packet_info *CaptureFile::packetInfo()
+{
+ if (capFile() && capFile()->edt) {
+ return &(capFile()->edt->pi);
+ }
+ return NULL;
+}
+
void CaptureFile::retapPackets()
{
if (cap_file_) {
diff --git a/ui/qt/capture_file.h b/ui/qt/capture_file.h
index af390d4a83..033fa06efa 100644
--- a/ui/qt/capture_file.h
+++ b/ui/qt/capture_file.h
@@ -31,6 +31,8 @@
typedef struct _capture_file capture_file;
typedef struct _capture_session capture_session;
+struct _packet_info;
+
class CaptureFile : public QObject
{
Q_OBJECT
@@ -68,6 +70,12 @@ public:
*/
const QString fileName();
+ /** Return the current packet information.
+ *
+ * @return A pointer to the current packet_info struct or NULL.
+ */
+ struct _packet_info *packetInfo();
+
/** Reload the capture file
*/
void reload();
diff --git a/ui/qt/conversation_colorize_action.cpp b/ui/qt/conversation_colorize_action.cpp
new file mode 100644
index 0000000000..63b1d9b001
--- /dev/null
+++ b/ui/qt/conversation_colorize_action.cpp
@@ -0,0 +1,80 @@
+/* conversation_colorize_action.cpp
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "conversation_colorize_action.h"
+
+#include <config.h>
+
+#include <glib.h>
+
+#include "epan/dissector_filters.h"
+
+#include "qt_ui_utils.h"
+
+ConversationAction::ConversationAction(QObject *parent, conversation_filter_s *conv_filter) :
+ QAction(parent),
+ color_number_(-1)
+{
+ conv_filter_ = conv_filter;
+ if (conv_filter_) {
+ setText(conv_filter_->display_name);
+ }
+}
+
+void ConversationAction::setPacketInfo(struct _packet_info *pinfo)
+{
+ bool enable = false;
+ if (conv_filter_ && pinfo) {
+ enable = conv_filter_->is_filter_valid(pinfo);
+ if (enable) {
+ filter_ba_ = gchar_free_to_qbytearray(conv_filter_->build_filter_string(pinfo));
+ }
+ }
+ setEnabled(enable);
+}
+
+void ConversationAction::setFieldFilter(const QByteArray field_filter)
+{
+ filter_ba_ = field_filter;
+ setEnabled(!filter_ba_.isEmpty());
+}
+
+bool ConversationAction::isFilterValid(struct _packet_info *pinfo)
+{
+ bool valid = false;
+ if (conv_filter_ && pinfo) {
+ valid = conv_filter_->is_filter_valid(pinfo);
+ }
+ return valid;
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/ui/qt/conversation_colorize_action.h b/ui/qt/conversation_colorize_action.h
new file mode 100644
index 0000000000..f250e0d159
--- /dev/null
+++ b/ui/qt/conversation_colorize_action.h
@@ -0,0 +1,90 @@
+/* conversation_colorize_action.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef CONVERSATIONCOLORIZEACTION_H
+#define CONVERSATIONCOLORIZEACTION_H
+
+#include <QAction>
+
+struct conversation_filter_s;
+struct _packet_info;
+
+// Actions for "Conversation Filter" and "Colorize with Filter" menu items.
+
+class ConversationAction : public QAction
+{
+ Q_OBJECT
+public:
+ ConversationAction(QObject *parent, struct conversation_filter_s *conv_filter = NULL);
+
+ bool isFilterValid(struct _packet_info *pinfo);
+
+ const QByteArray filter() { return filter_ba_; }
+
+ void setColorNumber(int color_number) { color_number_ = color_number; }
+ int colorNumber() { return color_number_; }
+
+public slots:
+ // Exactly one of these should be connected.
+ void setPacketInfo(struct _packet_info *pinfo);
+ void setFieldFilter(const QByteArray field_filter);
+
+private:
+ struct conversation_filter_s *conv_filter_;
+ QByteArray filter_ba_;
+ int color_number_;
+};
+
+class ColorizeAction : public QAction
+{
+ Q_OBJECT
+public:
+ ColorizeAction(QObject *parent) : QAction(parent),
+ color_number_(-1)
+ {}
+
+ const QByteArray filter() { return filter_ba_; }
+
+ void setColorNumber(int color_number) { color_number_ = color_number; }
+ int colorNumber() { return color_number_; }
+
+public slots:
+ void setFieldFilter(const QByteArray field_filter) { filter_ba_ = field_filter; }
+
+private:
+ QByteArray filter_ba_;
+ int color_number_;
+};
+
+#endif // CONVERSATIONCOLORIZEACTION_H
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index 3019748093..d7c23374a3 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -23,6 +23,7 @@
#include <ui_main_window.h>
#include <epan/addr_resolv.h>
+#include "epan/dissector_filters.h"
#include <epan/epan_dissect.h>
#include <wsutil/filesystem.h>
#include <wsutil/ws_version_info.h>
@@ -46,6 +47,7 @@
#include "ui/preference_utils.h"
#include "byte_view_tab.h"
+#include "conversation_colorize_action.h"
#include "display_filter_edit.h"
#include "export_dissection_dialog.h"
#include "funnel_statistics.h"
@@ -313,6 +315,7 @@ MainWindow::MainWindow(QWidget *parent) :
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addStatsPluginsToMenu()));
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addDynamicMenus()));
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addExternalMenus()));
+ connect(wsApp, SIGNAL(appInitialized()), this, SLOT(initConversationMenus()));
connect(wsApp, SIGNAL(profileChanging()), this, SLOT(saveWindowGeometry()));
connect(wsApp, SIGNAL(preferencesChanged()), this, SLOT(layoutPanes()));
@@ -1818,6 +1821,72 @@ void MainWindow::initFreezeActions()
}
}
+void MainWindow::initConversationMenus()
+{
+ int i;
+
+ 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;
+
+ 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;
+ ConversationAction *conv_action = new ConversationAction(main_ui_->menuConversationFilter, conv_filter);
+ main_ui_->menuConversationFilter->addAction(conv_action);
+
+ connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*)));
+ 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());
+ i = 1;
+
+ foreach (QAction *cc_action, cc_actions) {
+ conv_action = new ConversationAction(submenu, conv_filter);
+ conv_action->setText(cc_action->text());
+ conv_action->setIcon(cc_action->icon());
+ conv_action->setColorNumber(i++);
+ submenu->addAction(conv_action);
+ connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*)));
+ connect(conv_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
+ }
+
+ conv_action = new ConversationAction(submenu, conv_filter);
+ conv_action->setText(main_ui_->actionViewColorizeNewColoringRule->text());
+ submenu->addAction(conv_action);
+ connect(this, SIGNAL(packetInfoChanged(_packet_info*)), conv_action, SLOT(setPacketInfo(_packet_info*)));
+ connect(conv_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
+
+ // Proto tree conversation menu is filled in in ProtoTree::contextMenuEvent.
+ // We should probably do that here.
+ }
+
+ // Proto tree colorization items
+ i = 1;
+ ColorizeAction *colorize_action;
+ foreach (QAction *cc_action, cc_actions) {
+ colorize_action = new ColorizeAction(proto_tree_->colorizeMenu());
+ colorize_action->setText(cc_action->text());
+ colorize_action->setIcon(cc_action->icon());
+ colorize_action->setColorNumber(i++);
+ proto_tree_->colorizeMenu()->addAction(colorize_action);
+ connect(this, SIGNAL(fieldFilterChanged(QByteArray)), colorize_action, SLOT(setFieldFilter(QByteArray)));
+ connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
+ }
+
+ colorize_action = new ColorizeAction(proto_tree_->colorizeMenu());
+ colorize_action->setText(main_ui_->actionViewColorizeNewColoringRule->text());
+ proto_tree_->colorizeMenu()->addAction(colorize_action);
+ connect(this, SIGNAL(fieldFilterChanged(QByteArray)), colorize_action, SLOT(setFieldFilter(QByteArray)));
+ connect(colorize_action, SIGNAL(triggered()), this, SLOT(colorizeWithFilter()));
+}
+
// Titlebar
void MainWindow::setTitlebarForCaptureFile()
{
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index 88f0c074e6..f21e7cd9a6 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -224,6 +224,8 @@ signals:
void monospaceFontChanged(const QFont &mono_font);
void closePacketDialogs();
void reloadFields();
+ void packetInfoChanged(struct _packet_info *pinfo);
+ void fieldFilterChanged(const QByteArray field_filter);
public slots:
// in main_window_slots.cpp
@@ -277,6 +279,7 @@ private slots:
// Manually connected slots (no "on_<object>_<signal>").
void initViewColorizeMenu();
+ void initConversationMenus();
// in main_window_slots.cpp
/**
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
diff --git a/ui/qt/proto_tree.cpp b/ui/qt/proto_tree.cpp
index 5efc0aafc4..3d8d671a6e 100644
--- a/ui/qt/proto_tree.cpp
+++ b/ui/qt/proto_tree.cpp
@@ -38,7 +38,6 @@
// To do:
// - Fix "apply as filter" behavior.
-// - Add colorize conversation.
/* Fill a single protocol tree item with its string value and set its color. */
static void
diff --git a/ui/qt/qt_ui_utils.cpp b/ui/qt/qt_ui_utils.cpp
index 76beca1451..70d0834218 100644
--- a/ui/qt/qt_ui_utils.cpp
+++ b/ui/qt/qt_ui_utils.cpp
@@ -63,9 +63,14 @@ gchar *qstring_strdup(QString q_string) {
}
QString gchar_free_to_qstring(gchar *glib_string) {
- QString qt_string(glib_string);
+ return QString(gchar_free_to_qbytearray(glib_string));
+}
+
+QByteArray gchar_free_to_qbytearray(gchar *glib_string)
+{
+ QByteArray qt_bytearray(glib_string);
g_free(glib_string);
- return qt_string;
+ return qt_bytearray;
}
QByteArray gstring_free_to_qbytearray(GString *glib_gstring)
diff --git a/ui/qt/qt_ui_utils.h b/ui/qt/qt_ui_utils.h
index 4ca715e67d..3509b33130 100644
--- a/ui/qt/qt_ui_utils.h
+++ b/ui/qt/qt_ui_utils.h
@@ -71,6 +71,15 @@ gchar *qstring_strdup(QString q_string);
*/
QString gchar_free_to_qstring(gchar *glib_string);
+/** Transfer ownership of a GLib character string to a newly constructed QString
+ *
+ * @param glib_string A string allocated with g_malloc() or NULL. Will be
+ * freed.
+ *
+ * @return A QByteArray instance created from the input string.
+ */
+QByteArray gchar_free_to_qbytearray(gchar *glib_string);
+
/** Transfer ownership of a GLib character string to a newly constructed QByteArray
*
* @param glib_gstring A string allocated with g_malloc() or NULL. Will be