summaryrefslogtreecommitdiff
path: root/ui/typeeditor.h
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2023-11-06 15:28:59 -0500
committerGlenn Smith <glenn@vector35.com>2023-11-06 16:10:47 -0500
commit6436615567547349434351468012512505109552 (patch)
treee798973c25805377731c4a199f40379263bc128c /ui/typeeditor.h
parent4108964609171327618627477163339656037111 (diff)
Type Browser
Diffstat (limited to 'ui/typeeditor.h')
-rw-r--r--ui/typeeditor.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/ui/typeeditor.h b/ui/typeeditor.h
new file mode 100644
index 00000000..4de99778
--- /dev/null
+++ b/ui/typeeditor.h
@@ -0,0 +1,168 @@
+
+#pragma once
+
+#include "tokenizedtextwidget.h"
+#include "uitypes.h"
+
+class BINARYNINJAUIAPI TypeEditor: public TokenizedTextWidget
+{
+public:
+ struct SavedCursorPosition
+ {
+ struct PositionData
+ {
+ BinaryNinja::QualifiedName typeName;
+ TokenizedTextWidgetCursorPosition position;
+ size_t structOffset;
+ std::pair<size_t, size_t> lineStart;
+ };
+ bool restoreCursor;
+ bool restoreTop;
+ TokenizedTextWidgetSelectionStyle style;
+ PositionData cursor;
+ PositionData base;
+ PositionData top;
+ };
+
+private:
+ Q_OBJECT
+
+ PlatformRef m_platform;
+ std::optional<BinaryNinja::TypeContainer> m_typeContainer;
+ std::optional<BinaryViewRef> m_binaryView;
+ // Empty view for bv-requiring operations
+ mutable std::optional<BinaryViewRef> m_emptyView;
+ std::vector<BinaryNinja::QualifiedName> m_typeNames;
+
+ // line index -> index of first line from wrapped line
+ std::vector<size_t> m_lineUnwrapIndex;
+ // line index -> type name
+ std::vector<BinaryNinja::QualifiedName> m_lineTypeRefs;
+ // type name -> index of first line
+ std::map<BinaryNinja::QualifiedName, size_t> m_lineTypeStarts;
+ // type name -> { offset -> index of first { line, token } at offset }
+ std::map<BinaryNinja::QualifiedName, std::map<size_t, std::pair<size_t, size_t>>> m_lineTypeOffsetStarts;
+ // type name -> { offset -> index of last { line, token } at offset }
+ std::map<BinaryNinja::QualifiedName, std::map<size_t, std::pair<size_t, size_t>>> m_lineTypeOffsetEnds;
+ // line index -> line
+ std::vector<BinaryNinja::TypeDefinitionLine> m_typeLines;
+
+ TokenizedTextWidgetCursorPosition m_originalBase;
+
+ bool m_wrapLines;
+ bool m_showInherited;
+
+public:
+ TypeEditor(QWidget* parent);
+
+ static void registerActions();
+ void bindActions();
+
+ PlatformRef platform() const { return m_platform; }
+ void setPlatform(PlatformRef platform) { m_platform = platform; }
+
+ std::optional<BinaryViewRef> binaryView() const { return m_binaryView; }
+ void setBinaryView(std::optional<BinaryViewRef> binaryView) { m_binaryView = binaryView; }
+
+ std::optional<std::reference_wrapper<const BinaryNinja::TypeContainer>> typeContainer() const;
+ void setTypeContainer(std::optional<BinaryNinja::TypeContainer> container);
+
+ std::vector<BinaryNinja::QualifiedName> typeNames() const { return m_typeNames; }
+ void setTypeNames(const std::vector<BinaryNinja::QualifiedName>& names);
+
+ int selectedLineCount() const;
+ std::unordered_set<size_t> selectedLineStarts() const;
+ int selectedRootTypeCount() const;
+ std::unordered_set<BinaryNinja::QualifiedName> selectedRootTypes() const;
+ std::optional<size_t> firstWrappedLineIndexForLineIndex(size_t lineIndex) const;
+ std::optional<size_t> lastWrappedLineIndexForLineIndex(size_t lineIndex) const;
+ std::optional<std::reference_wrapper<const BinaryNinja::TypeDefinitionLine>> typeLineAtIndex(size_t lineIndex) const;
+ std::optional<std::reference_wrapper<const BinaryNinja::TypeDefinitionLine>> typeLineAtPosition(const TokenizedTextWidgetCursorPosition& position) const;
+ std::optional<BinaryNinja::QualifiedName> rootTypeNameAtIndex(size_t lineIndex) const;
+ std::optional<BinaryNinja::QualifiedName> rootTypeNameAtPosition(const TokenizedTextWidgetCursorPosition& position) const;
+ std::optional<TypeRef> rootTypeAtIndex(size_t lineIndex) const;
+ std::optional<TypeRef> rootTypeAtPosition(const TokenizedTextWidgetCursorPosition& position) const;
+ std::optional<uint64_t> offsetAtIndex(size_t lineIndex) const;
+ std::optional<uint64_t> offsetAtPosition(const TokenizedTextWidgetCursorPosition& position) const;
+ std::optional<int64_t> relativeOffsetAtPosition(const TokenizedTextWidgetCursorPosition& position) const;
+ std::optional<TokenizedTextWidgetCursorPosition> firstPositionForOffset(const BinaryNinja::QualifiedName& name, uint64_t offset) const;
+ std::optional<TokenizedTextWidgetCursorPosition> lastPositionForOffset(const BinaryNinja::QualifiedName& name, uint64_t offset) const;
+ void selectOffsetRange(const BinaryNinja::QualifiedName& name, uint64_t start, uint64_t end);
+
+ SavedCursorPosition saveCursorPosition() const;
+ void restoreCursorPosition(const SavedCursorPosition& position);
+
+ bool canCreateAllMembersForStructure();
+ void createAllMembersForStructure();
+ bool canCreateCurrentMemberForStructure();
+ void createCurrentMemberForStructure();
+ bool canRename();
+ void rename();
+ void renameRoot();
+ void renameMember();
+ bool canUndefine();
+ void undefine();
+ void undefineRoots();
+ void undefineMembers();
+ bool canCreateArray();
+ void createArray();
+ bool canChangeType();
+ void changeType();
+ void changeTypeRoot();
+ void changeTypeAddMember();
+ void changeTypeMember();
+ bool canChangeTypeMembers();
+ void changeTypeMembers(TypeRef newType);
+ bool canSetStructureSize();
+ void setStructureSize();
+ bool canAddUserXref();
+ void addUserXref();
+ bool canMakePointer();
+ void makePointer();
+ bool canMakeCString();
+ void makeCString();
+ bool canMakeUTF16String();
+ void makeUTF16String();
+ bool canMakeUTF32String();
+ void makeUTF32String();
+ bool canCycleIntegerSize();
+ void cycleIntegerSize();
+ bool canCycleFloatSize();
+ void cycleFloatSize();
+ bool canInvertIntegerSize();
+ void invertIntegerSize();
+ bool canMakeInt8();
+ void makeInt8();
+ bool canMakeInt16();
+ void makeInt16();
+ bool canMakeInt32();
+ void makeInt32();
+ bool canMakeInt64();
+ void makeInt64();
+ bool canMakeFloat32();
+ void makeFloat32();
+ bool canMakeFloat64();
+ void makeFloat64();
+ bool canGoToAddress(bool selecting);
+ void goToAddress(bool selecting);
+ void toggleWrapLines();
+ void toggleShowInherited();
+
+ std::string getDebugText();
+
+Q_SIGNALS:
+ void typeNameNavigated(const std::string& typeName);
+ void currentTypeUpdated(const BinaryNinja::QualifiedName& typeName);
+ void currentTypeDeleted(const BinaryNinja::QualifiedName& typeName);
+ void currentTypeNameUpdated(const BinaryNinja::QualifiedName& typeName);
+
+private:
+ void updateLines();
+ BinaryViewRef binaryViewOrEmpty() const;
+ void updateInTransaction(std::function<void()> transaction);
+ void updateInTransaction(std::function<void(BinaryViewRef)> transaction);
+ std::string dumpType(TypeRef type);
+
+ void forEachMember(const TokenizedTextWidgetCursorPosition& begin, const TokenizedTextWidgetCursorPosition& end,
+ std::function<void(TypeRef /* type */, TypeRef /* parent */, size_t /* memberIndex */, size_t /* rootOffset */)> func, bool childrenFirst = false);
+};