From 6931f581f90d272474b47d4a4606bb93183f449a Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Fri, 18 Mar 2016 10:34:41 -0700 Subject: 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 Tested-by: Petri Dish Buildbot Reviewed-by: Gerald Combs --- ui/qt/CMakeLists.txt | 2 + ui/qt/Makefile.common | 2 + ui/qt/Wireshark.pro | 2 + ui/qt/capture_file.cpp | 10 +++ ui/qt/capture_file.h | 8 ++ ui/qt/conversation_colorize_action.cpp | 80 +++++++++++++++++++ ui/qt/conversation_colorize_action.h | 90 +++++++++++++++++++++ ui/qt/main_window.cpp | 69 ++++++++++++++++ ui/qt/main_window.h | 3 + ui/qt/main_window_slots.cpp | 139 +++++++++------------------------ ui/qt/proto_tree.cpp | 1 - ui/qt/qt_ui_utils.cpp | 9 ++- ui/qt/qt_ui_utils.h | 9 +++ 13 files changed, 321 insertions(+), 103 deletions(-) create mode 100644 ui/qt/conversation_colorize_action.cpp create mode 100644 ui/qt/conversation_colorize_action.h (limited to 'ui/qt') 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 @@ -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 + * 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 + +#include + +#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 + * 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 + +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 #include +#include "epan/dissector_filters.h" #include #include #include @@ -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 cc_actions = QList() + << 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__"). 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 cc_actions = QList() - << 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(sender()); - if (!cc_action) return; + QAction *colorize_action = qobject_cast(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(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(sender()); + if (conv_action) { + filter = conv_action->filter(); + color_number = conv_action->colorNumber(); + } else { + ColorizeAction *colorize_action = qobject_cast(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(sender()); - if (!cfa) return; + ConversationAction *conv_action = qobject_cast(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 -- cgit v1.2.3