From c99c4f47ff9a86ea700005d55d435c1dacb2c764 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Mon, 13 Oct 2025 19:36:47 -0400 Subject: Refactor strings view to support derived strings --- ui/stringsview.h | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'ui/stringsview.h') diff --git a/ui/stringsview.h b/ui/stringsview.h index 99c66b79..b8689a3a 100644 --- a/ui/stringsview.h +++ b/ui/stringsview.h @@ -18,6 +18,36 @@ \ingroup uiapi */ +class StringsListItem +{ + std::variant m_contents; + +public: + StringsListItem(const BNStringReference& ref): m_contents(ref) {} + StringsListItem(const BinaryNinja::DerivedString& str): m_contents(str) {} + + bool IsStringReference() const { return std::holds_alternative(m_contents); } + bool IsDerivedString() const { return std::holds_alternative(m_contents); } + std::optional GetStringReference() const; + std::optional GetDerivedString() const; + + std::optional GetStartAddress() const; + BNDerivedStringLocationType GetLocationType() const; + uint64_t GetDataLength() const; + size_t GetCharacterLength() const; + std::optional GetStringType() const; + QString GetStringTypeName() const; + std::optional GetStringRef() const; + + QString GetString(BinaryViewRef data, bool simplified) const; + + std::optional GetReferenceCount(const std::map& refs, + const std::map& derivedRefs) const; + + bool operator==(const StringsListItem& other) const; + bool operator!=(const StringsListItem& other) const; +}; + /*! \ingroup stringsview @@ -28,15 +58,16 @@ class BINARYNINJAUIAPI StringsListModel : public QAbstractItemModel, public Bina struct StringUpdateEvent { - BNStringReference ref; + StringsListItem item; bool added; }; QWidget* m_stringsList; BinaryViewRef m_data; - std::vector m_allStrings; - std::vector m_strings; + std::vector m_allStrings; + std::vector m_strings; std::map m_refCounts; + std::map m_derivedRefCounts; std::string m_filter; size_t m_filteredByOptions; @@ -48,8 +79,8 @@ class BINARYNINJAUIAPI StringsListModel : public QAbstractItemModel, public Bina bool m_includeOnlyReferenced; bool m_includeOnlyFromCurrentFunction; - static bool stringComparison(const BNStringReference& a, const BNStringReference& b); - bool matchString(const BNStringReference& stringRef); + static bool stringComparison(const StringsListItem& a, const StringsListItem& b); + bool matchString(const StringsListItem& item); std::vector getQueuedStringUpdates(); @@ -74,8 +105,8 @@ class BINARYNINJAUIAPI StringsListModel : public QAbstractItemModel, public Bina virtual QVariant data(const QModelIndex& i, int role) const override; virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - BNStringReference getStringAt(const QModelIndex& i); - QModelIndex findString(const BNStringReference& ref); + StringsListItem getStringAt(const QModelIndex& i); + QModelIndex findString(const StringsListItem& item); virtual void OnStringFound(BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override; virtual void OnStringRemoved(BinaryNinja::BinaryView* data, BNStringType type, uint64_t offset, size_t len) override; @@ -147,8 +178,10 @@ class BINARYNINJAUIAPI StringsView : public QTableView, public View, public Filt StringsListModel* m_list; StringItemDelegate* m_itemDelegate; + bool m_selectionAddrValid = false; uint64_t m_selectionBegin, m_selectionEnd; uint64_t m_currentlySelectedDataAddress; + std::optional m_derivedString; public: StringsView(BinaryViewRef data, StringsContainer* container); @@ -156,6 +189,7 @@ class BINARYNINJAUIAPI StringsView : public QTableView, public View, public Filt virtual BinaryViewRef getData() override { return m_data; } virtual uint64_t getCurrentOffset() override; virtual BNAddressRange getSelectionOffsets() override; + virtual SelectionInfoForXref getSelectionForXref() override; virtual void setSelectionOffsets(BNAddressRange range) override; virtual bool navigate(uint64_t offset) override; -- cgit v1.3.1