aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2015-11-12 08:35:34 -0800
committerAnders Broman <a.broman58@gmail.com>2015-11-13 09:43:24 +0000
commit661c9771f6ffeeda4b2ba278a9f15d1d14dbe525 (patch)
treef3e22b8769e86885332ccf3ad6d5078f5a2036d7
parentacbf7d57253f4dc4206e3d67c0c56f6e28da6796 (diff)
Qt: Add go to next + previous packet in conversation.
Add "Go→Next Packet in Conversation" and "Go→Previous Packet in Conversation" menu items. Make sure the shortucts ("Ctrl+." and "Ctrl+,") don't get switched to "Cmd+." and "Cmd+," on OS X. "Cmd+," is already taken by the preferences dialog. Change-Id: Iab9c7f60fdcf55f12c055b4d0948019bf667ebc9 Reviewed-on: https://code.wireshark.org/review/11771 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--ui/qt/main_window.cpp6
-rw-r--r--ui/qt/main_window.h3
-rw-r--r--ui/qt/main_window.ui24
-rw-r--r--ui/qt/main_window_slots.cpp60
4 files changed, 92 insertions, 1 deletions
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index e39a7acbcb..f0bacdd7e3 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -1684,6 +1684,12 @@ void MainWindow::initMainToolbarIcons()
main_ui_->actionGoGoToPacket->setIcon(StockIcon("go-jump"));
main_ui_->actionGoFirstPacket->setIcon(StockIcon("go-first"));
main_ui_->actionGoLastPacket->setIcon(StockIcon("go-last"));
+ main_ui_->actionGoPreviousConversationPacket->setIcon(StockIcon("go-previous"));
+ main_ui_->actionGoNextConversationPacket->setIcon(StockIcon("go-next"));
+#if defined(Q_OS_MAC)
+ main_ui_->actionGoPreviousConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Comma));
+ main_ui_->actionGoNextConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Period));
+#endif
main_ui_->actionGoAutoScroll->setIcon(StockIcon("x-stay-last"));
main_ui_->actionViewColorizePacketList->setIcon(StockIcon("x-colorize-packets"));
diff --git a/ui/qt/main_window.h b/ui/qt/main_window.h
index 9c0a161247..d463edcf9d 100644
--- a/ui/qt/main_window.h
+++ b/ui/qt/main_window.h
@@ -203,6 +203,7 @@ private:
void addMenuActions(QList<QAction *> &actions, int menu_group);
void removeMenuActions(QList<QAction *> &actions, int menu_group);
+ void goToConversationFrame(bool go_next);
signals:
void setCaptureFile(capture_file *cf);
@@ -415,6 +416,8 @@ private slots:
void on_actionGoGoToPacket_triggered();
void on_actionGoGoToLinkedPacket_triggered();
+ void on_actionGoNextConversationPacket_triggered();
+ void on_actionGoPreviousConversationPacket_triggered();
void on_actionGoAutoScroll_toggled(bool checked);
void resetPreviousFocus();
diff --git a/ui/qt/main_window.ui b/ui/qt/main_window.ui
index 3ee4ffadbd..8946cb86be 100644
--- a/ui/qt/main_window.ui
+++ b/ui/qt/main_window.ui
@@ -238,6 +238,8 @@
<addaction name="actionGoPreviousPacket"/>
<addaction name="actionGoFirstPacket"/>
<addaction name="actionGoLastPacket"/>
+ <addaction name="actionGoNextConversationPacket"/>
+ <addaction name="actionGoPreviousConversationPacket"/>
<addaction name="separator"/>
<addaction name="actionGoAutoScroll"/>
</widget>
@@ -938,6 +940,28 @@
<string>Ctrl+Up</string>
</property>
</action>
+ <action name="actionGoNextConversationPacket">
+ <property name="text">
+ <string>Next Packet in Conversation</string>
+ </property>
+ <property name="toolTip">
+ <string>Go to the next packet in this conversation</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+.</string>
+ </property>
+ </action>
+ <action name="actionGoPreviousConversationPacket">
+ <property name="text">
+ <string>Previous Packet in Conversation</string>
+ </property>
+ <property name="toolTip">
+ <string>Go to the previous packet in this conversation</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+,</string>
+ </property>
+ </action>
<action name="actionGoFirstPacket">
<property name="text">
<string>First Packet</string>
diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp
index 419b46829a..9c5d386759 100644
--- a/ui/qt/main_window_slots.cpp
+++ b/ui/qt/main_window_slots.cpp
@@ -42,7 +42,7 @@
#include "wsutil/file_util.h"
#include "wsutil/filesystem.h"
-#include <wsutil/str_util.h>
+#include "wsutil/str_util.h"
#include "epan/addr_resolv.h"
#include "epan/dissector_filters.h"
@@ -3277,6 +3277,64 @@ void MainWindow::on_actionGoGoToLinkedPacket_triggered()
packet_list_->goToPacket(packet_num);
}
+// gtk/main_menubar.c:goto_conversation_frame
+void MainWindow::goToConversationFrame(bool go_next) {
+ gchar *filter = NULL;
+ dfilter_t *dfcode = NULL;
+ gboolean found_packet = FALSE;
+ packet_info *pi = &(capture_file_.capFile()->edt->pi);
+ conversation_filter_t* conv_filter;
+
+ /* Try to build a conversation
+ * filter in the order TCP, UDP, IP, Ethernet and apply the
+ * coloring */
+ conv_filter = find_conversation_filter("tcp");
+ if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi)))
+ filter = conv_filter->build_filter_string(pi);
+ conv_filter = find_conversation_filter("udp");
+ if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi)))
+ filter = conv_filter->build_filter_string(pi);
+ conv_filter = find_conversation_filter("ip");
+ if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi)))
+ filter = conv_filter->build_filter_string(pi);
+ conv_filter = find_conversation_filter("ipv6");
+ if ((conv_filter != NULL) && (conv_filter->is_filter_valid(pi)))
+ filter = conv_filter->build_filter_string(pi);
+
+ if( filter == NULL ) {
+ main_ui_->statusBar->pushTemporaryStatus(tr("Unable to build conversation filter."));
+ g_free(filter);
+ return;
+ }
+
+ if (!dfilter_compile(filter, &dfcode, NULL)) {
+ /* The attempt failed; report an error. */
+ main_ui_->statusBar->pushTemporaryStatus(tr("Error compiling filter for this conversation."));
+ g_free(filter);
+ return;
+ }
+
+ found_packet = cf_find_packet_dfilter(capture_file_.capFile(), dfcode, go_next ? SD_FORWARD : SD_BACKWARD);
+
+ if (!found_packet) {
+ /* We didn't find a packet */
+ main_ui_->statusBar->pushTemporaryStatus(tr("No previous/next packet in conversation."));
+ }
+
+ dfilter_free(dfcode);
+ g_free(filter);
+}
+
+void MainWindow::on_actionGoNextConversationPacket_triggered()
+{
+ goToConversationFrame(true);
+}
+
+void MainWindow::on_actionGoPreviousConversationPacket_triggered()
+{
+ goToConversationFrame(false);
+}
+
void MainWindow::on_actionGoAutoScroll_toggled(bool checked)
{
packet_list_->setAutoScroll(checked);