summaryrefslogtreecommitdiff
path: root/src/monitor-gui.cc
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@yahoo.com>2017-07-29 23:08:01 +0200
committerJoel Klinghed <the_jk@yahoo.com>2017-07-29 23:08:01 +0200
commite7a0bf680f3d805b190b89bfeb1f1f8a4c3ec982 (patch)
treef0799a14f1a697850eb7c05edd484ffdb4038f08 /src/monitor-gui.cc
parent53c474283e4e378185d86f57384bb5d8ae933df4 (diff)
Add basic "Jump to related" which jumps to request/response respectivly
Diffstat (limited to 'src/monitor-gui.cc')
-rw-r--r--src/monitor-gui.cc46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/monitor-gui.cc b/src/monitor-gui.cc
index 9d72608..2b8cf07 100644
--- a/src/monitor-gui.cc
+++ b/src/monitor-gui.cc
@@ -61,6 +61,7 @@ std::string const ACTION_NEW = "new";
std::string const ACTION_OPEN = "open";
std::string const ACTION_SAVE = "save";
std::string const ACTION_SAVE_AS = "save_as";
+std::string const ACTION_JUMP = "jump";
bool valid_hostname(std::string const& host) {
return !host.empty();
@@ -105,6 +106,8 @@ std::string default_cert_bundle() {
class PackageList : public GuiListModel {
public:
+ static const size_t NONE;
+
struct Package {
::Package pkg;
@@ -115,7 +118,10 @@ public:
std::string data;
- Package() {
+ size_t related;
+
+ Package()
+ : related(NONE) {
}
};
@@ -175,6 +181,15 @@ public:
format_host_port(&pkg.to, package.target_host, package.target_port);
format_size(&pkg.size, 0, false);
+ auto related = related_.find(pkg.to);
+ if (related == related_.end()) {
+ related_[pkg.from] = index;
+ } else {
+ pkg.related = related->second;
+ packages_[pkg.related].related = index;
+ related_.erase(related);
+ }
+
notify_added(index, index);
}
@@ -209,6 +224,7 @@ public:
if (last == 0) return;
packages_.clear();
open_.clear();
+ related_.clear();
notify_removed(0, last - 1);
}
@@ -270,12 +286,15 @@ private:
std::unordered_map<uint32_t, size_t> open_;
Observers<Listener*> listeners_;
struct timespec epoch_;
+ std::unordered_map<std::string, size_t> related_;
static const std::string empty_;
};
// static
const PackageList::Package PackageList::EMPTY;
+// static
+const size_t PackageList::NONE = std::numeric_limits<size_t>::max();
// static
const std::string PackageList::empty_;
@@ -655,6 +674,7 @@ public:
statusbar_(GuiStatusBar::create()),
looper_(main_->createLooper()),
has_selection_(false),
+ has_related_(false),
selection_(0),
modified_(false)
{
@@ -703,6 +723,8 @@ public:
edit->add_item(ACTION_COPY_TEXT, "Copy");
edit->add_item(ACTION_COPY_RAW, "Copy binary");
edit->add_separator();
+ edit->add_item(ACTION_JUMP, "Jump to related");
+ edit->add_separator();
edit->add_item(ACTION_CLEAR, "Clear");
#if HAVE_SSL
auto tools = menu_->add_menu("Tools");
@@ -722,6 +744,7 @@ public:
menu_->enable_item(ACTION_COPY_RAW, false);
menu_->enable_item(ACTION_COPY_TEXT, false);
+ menu_->enable_item(ACTION_JUMP, false);
menu_->add_listener(this);
main_->add_listener(this);
@@ -849,6 +872,17 @@ public:
}
auto& pkg = packages_->package(selection_);
main_->add_to_clipboard(pkg.data, "application/octet-stream");
+ } else if (id == ACTION_JUMP) {
+ if (!has_selection_) {
+ assert(false);
+ return;
+ }
+ auto& pkg = packages_->package(selection_);
+ if (pkg.related == PackageList::NONE) {
+ assert(false);
+ return;
+ }
+ main_->select_row(pkg.related);
} else if (id == ACTION_CLEAR) {
packages_->clear();
set_modified(true);
@@ -916,17 +950,22 @@ public:
HexDump::write(text.get(), HexDump::ADDRESS | HexDump::CHARS, pkg.data);
main_->set_package(std::move(text));
+ has_related_ = pkg.related != PackageList::NONE;
+
menu_->enable_item(ACTION_COPY_RAW, true);
menu_->enable_item(ACTION_COPY_TEXT, true);
+ menu_->enable_item(ACTION_JUMP, has_related_);
}
void lost_selection(GuiMain* main) override {
assert(main_.get() == main);
has_selection_ = false;
+ has_related_ = false;
main_->set_package(nullptr);
menu_->enable_item(ACTION_COPY_RAW, false);
menu_->enable_item(ACTION_COPY_TEXT, false);
+ menu_->enable_item(ACTION_JUMP, false);
}
void open(GuiMain*, std::string const& file) override {
@@ -1003,6 +1042,10 @@ public:
assert(monitor == monitor_.get());
packages_->package(package);
set_modified(true);
+ if (has_selection_ && !has_related_) {
+ auto const& pkg = packages_->package(selection_);
+ menu_->enable_item(ACTION_JUMP, pkg.related != PackageList::NONE);
+ }
}
void package_data(Monitor* monitor, uint32_t id,
@@ -1473,6 +1516,7 @@ private:
std::vector<GuiFile::Filter> pem_filter_;
std::vector<GuiFile::Filter> crt_filter_;
bool has_selection_;
+ bool has_related_;
size_t selection_;
std::vector<GuiFile::Filter> file_filter_;
std::string file_;