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 <gerald@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Alexis La Goutte 2014-08-08 12:59:42 +02:00 committed by Gerald Combs
parent 486a530451
commit 3827c81473
9 changed files with 85 additions and 26 deletions

View File

@ -54,6 +54,7 @@ const QList<FilterAction::Action> FilterAction::actions() {
<< ActionApply << ActionApply
<< ActionPrepare << ActionPrepare
<< ActionFind << ActionFind
<< ActionConversation
<< ActionColorize << ActionColorize
<< ActionWebLookup << ActionWebLookup
<< ActionCopy; << ActionCopy;
@ -71,6 +72,9 @@ const QString FilterAction::actionName(Action action) {
case ActionFind: case ActionFind:
return QObject::tr("Find"); return QObject::tr("Find");
break; break;
case ActionConversation:
return QObject::tr("Conversation Filter");
break;
case ActionColorize: case ActionColorize:
return QObject::tr("Colorize"); return QObject::tr("Colorize");
break; break;

View File

@ -37,6 +37,7 @@ public:
ActionApply, ActionApply,
ActionPrepare, ActionPrepare,
ActionFind, ActionFind,
ActionConversation,
ActionColorize, ActionColorize,
ActionWebLookup, ActionWebLookup,
ActionCopy ActionCopy

View File

@ -375,6 +375,8 @@ private slots:
void on_actionAnalyzePAFAndNotSelected_triggered(); void on_actionAnalyzePAFAndNotSelected_triggered();
void on_actionAnalyzePAFOrNotSelected_triggered(); void on_actionAnalyzePAFOrNotSelected_triggered();
void applyConversationFilter();
void on_actionAnalyzeDecodeAs_triggered(); void on_actionAnalyzeDecodeAs_triggered();
void openFollowStreamDialog(follow_type_t type); void openFollowStreamDialog(follow_type_t type);

View File

@ -340,12 +340,18 @@
<addaction name="actionAnalyzeFollowUDPStream"/> <addaction name="actionAnalyzeFollowUDPStream"/>
<addaction name="actionAnalyzeFollowSSLStream"/> <addaction name="actionAnalyzeFollowSSLStream"/>
</widget> </widget>
<widget class="QMenu" name="menuConversationFilter">
<property name="title">
<string>Conversation Filter</string>
</property>
</widget>
<addaction name="actionAnalyzeDisplayFilters"/> <addaction name="actionAnalyzeDisplayFilters"/>
<addaction name="actionAnalyzeDisplayFilterMacros"/> <addaction name="actionAnalyzeDisplayFilterMacros"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionAnalyzeCreateAColumn"/> <addaction name="actionAnalyzeCreateAColumn"/>
<addaction name="menuApplyAsFilter"/> <addaction name="menuApplyAsFilter"/>
<addaction name="menuPrepareAFilter"/> <addaction name="menuPrepareAFilter"/>
<addaction name="menuConversationFilter"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionAnalyzeDecodeAs"/> <addaction name="actionAnalyzeDecodeAs"/>
<addaction name="separator"/> <addaction name="separator"/>

View File

@ -48,6 +48,7 @@
#include <wsutil/str_util.h> #include <wsutil/str_util.h>
#include "epan/addr_resolv.h" #include "epan/addr_resolv.h"
#include "epan/color_dissector_filters.h"
#include "epan/column.h" #include "epan/column.h"
#include "epan/epan_dissect.h" #include "epan/epan_dissect.h"
#include "epan/filter_expressions.h" #include "epan/filter_expressions.h"
@ -110,6 +111,7 @@
#include "time_shift_dialog.h" #include "time_shift_dialog.h"
#include "voip_calls_dialog.h" #include "voip_calls_dialog.h"
#include "wireshark_application.h" #include "wireshark_application.h"
#include "filter_action.h"
#include <QClipboard> #include <QClipboard>
#include <QFileInfo> #include <QFileInfo>
@ -952,16 +954,8 @@ void MainWindow::recentActionTriggered() {
void MainWindow::setMenusForSelectedPacket() void MainWindow::setMenusForSelectedPacket()
{ {
// GList *list_entry = dissector_filter_list; // gboolean is_ip = FALSE, is_tcp = FALSE, is_udp = FALSE, is_sctp = FALSE, is_ssl = FALSE;
// 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_tcp = FALSE, is_sctp = FALSE; gboolean is_tcp = FALSE, is_sctp = FALSE;
#endif
// /* Making the menu context-sensitive allows for easier selection of the // /* Making the menu context-sensitive allows for easier selection of the
// desired item and has the added benefit, with large captures, of // desired item and has the added benefit, with large captures, of
@ -1089,16 +1083,23 @@ void MainWindow::setMenusForSelectedPacket()
// frame_selected ? is_ssl : FALSE); // frame_selected ? is_ssl : FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowSSLStream", // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowSSLStream",
// frame_selected ? is_ssl : FALSE); // frame_selected ? is_ssl : FALSE);
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter",
// frame_selected); main_ui_->menuConversationFilter->clear();
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/Ethernet", for (GList *color_list_entry = color_conv_filter_list; color_list_entry; color_list_entry = g_list_next(color_list_entry)) {
// frame_selected ? (cf->edt->pi.dl_src.type == AT_ETHER) : FALSE); color_conversation_filter_t* color_filter = (color_conversation_filter_t *)color_list_entry->data;
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/IP", QAction *conv_action = main_ui_->menuConversationFilter->addAction(color_filter->display_name);
// frame_selected ? is_ip : FALSE);
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/TCP", bool enable = false;
// frame_selected ? is_tcp : FALSE); QString filter;
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/UDP", if (capture_file_.capFile()->edt) {
// frame_selected ? is_udp : FALSE); 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", // set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FollowUDPStream",
// frame_selected ? is_udp : FALSE); // frame_selected ? is_udp : FALSE);
// set_menu_sensitivity(ui_manager_packet_list_menu, "/PacketListMenuPopup/ConversationFilter/PN-CBA", // 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) { void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
//gboolean properties;
//gint id;
// XXX Add commented items below // XXX Add commented items below
if (capture_file_.capFile()) { if (capture_file_.capFile()) {
@ -1255,7 +1253,24 @@ void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected); main_ui_->actionAnalyzePAFAndNotSelected->setEnabled(can_match_selected);
main_ui_->actionAnalyzePAFOrNotSelected->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); 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"); // prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev");
// if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) { // if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) {
// /* No previous protocol or protocol changed - update Protocol Preferences menu */ // /* 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<QAction*>(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 // XXX We could probably create the analyze and prepare actions
// dynamically using FilterActions and consolidate the methods // dynamically using FilterActions and consolidate the methods
// below into one callback. // below into one callback.

View File

@ -300,16 +300,17 @@ PacketList::PacketList(QWidget *parent) :
submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFAndNotSelected")); submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFAndNotSelected"));
submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFOrNotSelected")); submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFOrNotSelected"));
// action = window()->findChild<QAction *>("actionColorize_with_Filter"); QMenu *main_conv_menu = window()->findChild<QMenu *>("menuConversationFilter");
// submenu = new QMenu(); conv_menu_.setTitle(main_conv_menu->title());
// action->setMenu(submenu); ctx_menu_.addMenu(&conv_menu_);
// ctx_menu_.addAction(action);
// " <menu name= 'ConversationFilter' action='/Conversation Filter'>\n" // " <menu name= 'ConversationFilter' action='/Conversation Filter'>\n"
// " <menuitem name='Ethernet' action='/Conversation Filter/Ethernet'/>\n" // " <menuitem name='Ethernet' action='/Conversation Filter/Ethernet'/>\n"
// " <menuitem name='IP' action='/Conversation Filter/IP'/>\n" // " <menuitem name='IP' action='/Conversation Filter/IP'/>\n"
// " <menuitem name='TCP' action='/Conversation Filter/TCP'/>\n" // " <menuitem name='TCP' action='/Conversation Filter/TCP'/>\n"
// " <menuitem name='UDP' action='/Conversation Filter/UDP'/>\n" // " <menuitem name='UDP' action='/Conversation Filter/UDP'/>\n"
// " <menuitem name='PN-CBA' action='/Conversation Filter/PN-CBA'/>\n" // " <menuitem name='PN-CBA' action='/Conversation Filter/PN-CBA'/>\n"
//submenu = new QMenu(tr("Colorize with Filter"));
// " <menu name= 'ColorizeConversation' action='/Colorize Conversation'>\n" // " <menu name= 'ColorizeConversation' action='/Colorize Conversation'>\n"
// " <menu name= 'Ethernet' action='/Colorize Conversation/Ethernet'>\n" // " <menu name= 'Ethernet' action='/Colorize Conversation/Ethernet'>\n"
// " <menuitem name='Color1' action='/Colorize Conversation/Ethernet/Color 1'/>\n" // " <menuitem name='Color1' action='/Colorize Conversation/Ethernet/Color 1'/>\n"
@ -506,6 +507,12 @@ void PacketList::contextMenuEvent(QContextMenuEvent *event)
if (cap_file_ != NULL && cap_file_->edt != NULL) 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); proto_get_frame_protocols(cap_file_->edt->pi.layers, NULL, &is_tcp, &is_udp, &is_sctp, NULL);
QMenu *main_conv_menu = window()->findChild<QMenu *>("menuConversationFilter");
conv_menu_.clear();
foreach (action, main_conv_menu->actions()) {
conv_menu_.addAction(action);
}
action = window()->findChild<QAction *>("actionSCTP"); action = window()->findChild<QAction *>("actionSCTP");
if (cap_file_ != NULL && cap_file_->edt != NULL && is_sctp) if (cap_file_ != NULL && cap_file_->edt != NULL && is_sctp)
action->setEnabled(TRUE); action->setEnabled(TRUE);

View File

@ -83,6 +83,7 @@ private:
ByteViewTab *byte_view_tab_; ByteViewTab *byte_view_tab_;
capture_file *cap_file_; capture_file *cap_file_;
QMenu ctx_menu_; QMenu ctx_menu_;
QMenu conv_menu_;
QAction *decode_as_; QAction *decode_as_;
int ctx_column_; int ctx_column_;
QByteArray column_state_; QByteArray column_state_;

View File

@ -195,6 +195,10 @@ ProtoTree::ProtoTree(QWidget *parent) :
submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFAndNotSelected")); submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFAndNotSelected"));
submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFOrNotSelected")); submenu->addAction(window()->findChild<QAction *>("actionAnalyzePAFOrNotSelected"));
QMenu *main_conv_menu = window()->findChild<QMenu *>("menuConversationFilter");
conv_menu_.setTitle(main_conv_menu->title());
ctx_menu_.addMenu(&conv_menu_);
// action = window()->findChild<QAction *>("actionColorize_with_Filter"); // action = window()->findChild<QAction *>("actionColorize_with_Filter");
// submenu = new QMenu(); // submenu = new QMenu();
// action->setMenu(submenu); // action->setMenu(submenu);
@ -276,6 +280,12 @@ void ProtoTree::contextMenuEvent(QContextMenuEvent *event)
{ {
if (ctx_menu_.isEmpty()) return; // We're in a PacketDialog if (ctx_menu_.isEmpty()) return; // We're in a PacketDialog
QMenu *main_conv_menu = window()->findChild<QMenu *>("menuConversationFilter");
conv_menu_.clear();
foreach (QAction *action, main_conv_menu->actions()) {
conv_menu_.addAction(action);
}
decode_as_->setData(qVariantFromValue(true)); decode_as_->setData(qVariantFromValue(true));
ctx_menu_.exec(event->globalPos()); ctx_menu_.exec(event->globalPos());
decode_as_->setData(QVariant()); decode_as_->setData(QVariant());

View File

@ -46,6 +46,7 @@ protected:
private: private:
QMenu ctx_menu_; QMenu ctx_menu_;
QMenu conv_menu_;
QAction *decode_as_; QAction *decode_as_;
QFont mono_font_; QFont mono_font_;