diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2017-07-29 23:08:01 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2017-07-29 23:08:01 +0200 |
| commit | e7a0bf680f3d805b190b89bfeb1f1f8a4c3ec982 (patch) | |
| tree | f0799a14f1a697850eb7c05edd484ffdb4038f08 /src/monitor-gui.cc | |
| parent | 53c474283e4e378185d86f57384bb5d8ae933df4 (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.cc | 46 |
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_; |
