From 3827c81473f382ce72a0b0aab6ff0da1140692aa Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Fri, 8 Aug 2014 12:59:42 +0200 Subject: [PATCH] Qt: Add Conversation Filter sub menu Apply conversation filters using the new color_dissector_filters.[ch] from g1f03180. Change-Id: I2e535bb3d5b95fd26226422daf9f83c452a95e3c Reviewed-on: https://code.wireshark.org/review/3558 Petri-Dish: Gerald Combs Reviewed-by: Alexis La Goutte Tested-by: Petri Dish Buildbot Reviewed-by: Gerald Combs --- ui/qt/filter_action.cpp | 4 +++ ui/qt/filter_action.h | 1 + ui/qt/main_window.h | 2 ++ ui/qt/main_window.ui | 6 ++++ ui/qt/main_window_slots.cpp | 71 +++++++++++++++++++++++++------------ ui/qt/packet_list.cpp | 15 +++++--- ui/qt/packet_list.h | 1 + ui/qt/proto_tree.cpp | 10 ++++++ ui/qt/proto_tree.h | 1 + 9 files changed, 85 insertions(+), 26 deletions(-) diff --git a/ui/qt/filter_action.cpp b/ui/qt/filter_action.cpp index dfb36e1593..e720b0e1b9 100644 --- a/ui/qt/filter_action.cpp +++ b/ui/qt/filter_action.cpp @@ -54,6 +54,7 @@ const QList FilterAction::actions() { << ActionApply << ActionPrepare << ActionFind + << ActionConversation << ActionColorize << ActionWebLookup << ActionCopy; @@ -71,6 +72,9 @@ const QString FilterAction::actionName(Action action) { case ActionFind: return QObject::tr("Find"); break; + case ActionConversation: + return QObject::tr("Conversation Filter"); + break; case ActionColorize: return QObject::tr("Colorize"); break; diff --git a/ui/qt/filter_action.h b/ui/qt/filter_action.h index 65b12e7cda..c9c2086273 100644 --- a/ui/qt/filter_action.h +++ b/ui/qt/filter_action.h @@ -37,6 +37,7 @@ public: ActionApply, ActionPrepare, ActionFind, + ActionConversation, ActionColorize, ActionWebLookup, ActionCopy diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h index a40b5e8d4e..f4b268357b 100644 --- a/ui/qt/main_window.h +++ b/ui/qt/main_window.h @@ -375,6 +375,8 @@ private slots: void on_actionAnalyzePAFAndNotSelected_triggered(); void on_actionAnalyzePAFOrNotSelected_triggered(); + void applyConversationFilter(); + void on_actionAnalyzeDecodeAs_triggered(); void openFollowStreamDialog(follow_type_t type); diff --git a/ui/qt/main_window.ui b/ui/qt/main_window.ui index d05587f108..8e231a2c0d 100644 --- a/ui/qt/main_window.ui +++ b/ui/qt/main_window.ui @@ -340,12 +340,18 @@ + + + Conversation Filter + + + diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index 5da120acdb..e883f512e4 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -48,6 +48,7 @@ #include #include "epan/addr_resolv.h" +#include "epan/color_dissector_filters.h" #include "epan/column.h" #include "epan/epan_dissect.h" #include "epan/filter_expressions.h" @@ -110,6 +111,7 @@ #include "time_shift_dialog.h" #include "voip_calls_dialog.h" #include "wireshark_application.h" +#include "filter_action.h" #include #include @@ -952,16 +954,8 @@ void MainWindow::recentActionTriggered() { void MainWindow::setMenusForSelectedPacket() { -// GList *list_entry = dissector_filter_list; -// guint i = 0; -// gboolean properties = FALSE; -// const char *abbrev = NULL; -// char *prev_abbrev; -#if 0 - gboolean is_ip = FALSE, is_tcp = FALSE, is_udp = FALSE, is_sctp = FALSE; -#else +// gboolean is_ip = FALSE, is_tcp = FALSE, is_udp = FALSE, is_sctp = FALSE, is_ssl = FALSE; gboolean is_tcp = FALSE, is_sctp = FALSE; -#endif // /* Making the menu context-sensitive allows for easier selection of the // desired item and has the added benefit, with large captures, of @@ -1089,16 +1083,23 @@ void MainWindow::setMenusForSelectedPacket() // frame_selected ? is_ssl : FALSE); // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowSSLStream", // frame_selected ? is_ssl : FALSE); -// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter", -// frame_selected); -// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/Ethernet", -// frame_selected ? (cf->edt->pi.dl_src.type == AT_ETHER) : FALSE); -// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/IP", -// frame_selected ? is_ip : FALSE); -// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/TCP", -// frame_selected ? is_tcp : FALSE); -// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/UDP", -// frame_selected ? is_udp : FALSE); + + main_ui_->menuConversationFilter->clear(); + for (GList *color_list_entry = color_conv_filter_list; color_list_entry; color_list_entry = g_list_next(color_list_entry)) { + color_conversation_filter_t* color_filter = (color_conversation_filter_t *)color_list_entry->data; + QAction *conv_action = main_ui_->menuConversationFilter->addAction(color_filter->display_name); + + bool enable = false; + QString filter; + if (capture_file_.capFile()->edt) { + enable = color_filter->is_filter_valid(&capture_file_.capFile()->edt->pi); + filter = color_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())); + } + // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowUDPStream", // frame_selected ? is_udp : FALSE); // set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/PN-CBA", @@ -1172,9 +1173,6 @@ void MainWindow::setMenusForSelectedPacket() } void MainWindow::setMenusForSelectedTreeRow(field_info *fi) { - //gboolean properties; - //gint id; - // XXX Add commented items below if (capture_file_.capFile()) { @@ -1255,7 +1253,24 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) { main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected); main_ui_->actionAnalyzePAFOrNotSelected->setEnabled(can_match_selected); + main_ui_->menuConversationFilter->clear(); + for (GList *color_list_entry = color_conv_filter_list; color_list_entry; color_list_entry = g_list_next(color_list_entry)) { + color_conversation_filter_t* color_filter = (color_conversation_filter_t *)color_list_entry->data; + QAction *conv_action = main_ui_->menuConversationFilter->addAction(color_filter->display_name); + + bool enable = false; + QString filter; + if (capture_file_.capFile()->edt) { + enable = color_filter->is_filter_valid(&capture_file_.capFile()->edt->pi); + filter = color_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())); + } + main_ui_->actionViewExpandSubtrees->setEnabled(capture_file_.capFile()->finfo_selected->tree_type != -1); + // prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev"); // if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) { // /* No previous protocol or protocol changed - update Protocol Preferences menu */ @@ -2215,6 +2230,18 @@ void MainWindow::on_actionAnalyzeCreateAColumn_triggered() } } +void MainWindow::applyConversationFilter() +{ + QAction *cfa = qobject_cast(sender()); + if (!cfa) return; + + QString new_filter = cfa->data().toString(); + if (new_filter.isEmpty()) return; + + df_combo_box_->lineEdit()->setText(new_filter); + df_combo_box_->applyDisplayFilter(); +} + // XXX We could probably create the analyze and prepare actions // dynamically using FilterActions and consolidate the methods // below into one callback. diff --git a/ui/qt/packet_list.cpp b/ui/qt/packet_list.cpp index 132bb5b39c..bffc2fee60 100644 --- a/ui/qt/packet_list.cpp +++ b/ui/qt/packet_list.cpp @@ -300,16 +300,17 @@ PacketList::PacketList(QWidget *parent) : submenu->addAction(window()->findChild("actionAnalyzePAFAndNotSelected")); submenu->addAction(window()->findChild("actionAnalyzePAFOrNotSelected")); -// action = window()->findChild("actionColorize_with_Filter"); -// submenu = new QMenu(); -// action->setMenu(submenu); -// ctx_menu_.addAction(action); + QMenu *main_conv_menu = window()->findChild("menuConversationFilter"); + conv_menu_.setTitle(main_conv_menu->title()); + ctx_menu_.addMenu(&conv_menu_); + // " \n" // " \n" // " \n" // " \n" // " \n" // " \n" + //submenu = new QMenu(tr("Colorize with Filter")); // " \n" // " \n" // " \n" @@ -506,6 +507,12 @@ void PacketList::contextMenuEvent(QContextMenuEvent *event) if (cap_file_ != NULL && cap_file_->edt != NULL) proto_get_frame_protocols(cap_file_->edt->pi.layers, NULL, &is_tcp, &is_udp, &is_sctp, NULL); + QMenu *main_conv_menu = window()->findChild("menuConversationFilter"); + conv_menu_.clear(); + foreach (action, main_conv_menu->actions()) { + conv_menu_.addAction(action); + } + action = window()->findChild("actionSCTP"); if (cap_file_ != NULL && cap_file_->edt != NULL && is_sctp) action->setEnabled(TRUE); diff --git a/ui/qt/packet_list.h b/ui/qt/packet_list.h index 4bdf59cb09..41ae6b141b 100644 --- a/ui/qt/packet_list.h +++ b/ui/qt/packet_list.h @@ -83,6 +83,7 @@ private: ByteViewTab *byte_view_tab_; capture_file *cap_file_; QMenu ctx_menu_; + QMenu conv_menu_; QAction *decode_as_; int ctx_column_; QByteArray column_state_; diff --git a/ui/qt/proto_tree.cpp b/ui/qt/proto_tree.cpp index ac2dac3a52..2d1b404587 100644 --- a/ui/qt/proto_tree.cpp +++ b/ui/qt/proto_tree.cpp @@ -195,6 +195,10 @@ ProtoTree::ProtoTree(QWidget *parent) : submenu->addAction(window()->findChild("actionAnalyzePAFAndNotSelected")); submenu->addAction(window()->findChild("actionAnalyzePAFOrNotSelected")); + QMenu *main_conv_menu = window()->findChild("menuConversationFilter"); + conv_menu_.setTitle(main_conv_menu->title()); + ctx_menu_.addMenu(&conv_menu_); + // action = window()->findChild("actionColorize_with_Filter"); // submenu = new QMenu(); // action->setMenu(submenu); @@ -276,6 +280,12 @@ void ProtoTree::contextMenuEvent(QContextMenuEvent *event) { if (ctx_menu_.isEmpty()) return; // We're in a PacketDialog + QMenu *main_conv_menu = window()->findChild("menuConversationFilter"); + conv_menu_.clear(); + foreach (QAction *action, main_conv_menu->actions()) { + conv_menu_.addAction(action); + } + decode_as_->setData(qVariantFromValue(true)); ctx_menu_.exec(event->globalPos()); decode_as_->setData(QVariant()); diff --git a/ui/qt/proto_tree.h b/ui/qt/proto_tree.h index 92cd3e1291..d2b86a4345 100644 --- a/ui/qt/proto_tree.h +++ b/ui/qt/proto_tree.h @@ -46,6 +46,7 @@ protected: private: QMenu ctx_menu_; + QMenu conv_menu_; QAction *decode_as_; QFont mono_font_;