summaryrefslogtreecommitdiff
path: root/ui/linearview.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-03-19 15:41:08 -0400
committerRusty Wagner <rusty@vector35.com>2019-03-20 13:00:17 -0400
commit411acbaa4a1d217e731d3df0b189445117be3b26 (patch)
tree49b5c5290058ffb98dd23ec9a7c1a49921254d15 /ui/linearview.h
parentca1bc587c22928bbd7198813064c9615c3c12771 (diff)
Add in progress UI API headers
Diffstat (limited to 'ui/linearview.h')
-rw-r--r--ui/linearview.h235
1 files changed, 235 insertions, 0 deletions
diff --git a/ui/linearview.h b/ui/linearview.h
new file mode 100644
index 00000000..4c67e8d8
--- /dev/null
+++ b/ui/linearview.h
@@ -0,0 +1,235 @@
+#pragma once
+
+#include <QtWidgets/QAbstractScrollArea>
+#include <QtCore/QTimer>
+#include "binaryninjaapi.h"
+#include "viewframe.h"
+#include "render.h"
+#include "commentdialog.h"
+#include "menus.h"
+#include "statusbarwidget.h"
+#include "uicontext.h"
+
+#define LINEAR_VIEW_UPDATE_CHECK_INTERVAL 200
+#define MAX_STRING_TYPE_LENGTH 1048576
+#define EDGE_GUTTER_WIDTH 4
+
+class BINARYNINJAUIAPI LinearViewHistoryEntry: public HistoryEntry
+{
+ BinaryNinja::LinearDisassemblyPosition m_topPosition, m_cursorPosition;
+ size_t m_topLineOffset;
+ HighlightTokenState m_highlight;
+
+public:
+ const BinaryNinja::LinearDisassemblyPosition& getTopPosition() const { return m_topPosition; }
+ const BinaryNinja::LinearDisassemblyPosition& getCursorPosition() const { return m_cursorPosition; }
+ size_t getTopLineOffset() const { return m_topLineOffset; }
+ const HighlightTokenState& getHighlightTokenState() const { return m_highlight; }
+
+ void setTopPosition(const BinaryNinja::LinearDisassemblyPosition& pos) { m_topPosition = pos; }
+ void setCursorPosition(const BinaryNinja::LinearDisassemblyPosition& pos) { m_cursorPosition = pos; }
+ void setTopLineOffset(size_t offset) { m_topLineOffset = offset; }
+ void setHighlightTokenState(const HighlightTokenState& state) { m_highlight = state; }
+};
+
+class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, public BinaryNinja::BinaryDataNotification
+{
+ Q_OBJECT
+
+ class LinearViewOptionsWidget: public QLabel
+ {
+ public:
+ LinearViewOptionsWidget(LinearView* parent);
+
+ protected:
+ virtual void mousePressEvent(QMouseEvent* event);
+ virtual void enterEvent(QEvent* event);
+ virtual void leaveEvent(QEvent* event);
+
+ private:
+ LinearView* m_view;
+ Menu m_menu;
+ ContextMenuManager m_contextMenuManager;
+ };
+
+ class LinearViewStatusBarWidget: public StatusBarWidget
+ {
+ public:
+ LinearViewStatusBarWidget(LinearView* parent);
+ virtual void updateStatus() override;
+
+ private:
+ LinearView* m_view;
+ LinearViewOptionsWidget* m_options;
+ };
+
+ BinaryViewRef m_data;
+ ViewFrame* m_view;
+ std::vector<BNAddressRange> m_ranges;
+ uint64_t m_allocatedLength;
+
+ RenderContext m_render;
+ int m_cols, m_rows;
+ uint64_t m_scrollBarMultiplier;
+ int m_wheelDelta;
+ bool m_updatingScrollBar;
+
+ bool m_updatesRequired;
+ bool m_updateBounds, m_updateBlockRef;
+
+ BinaryNinja::LinearDisassemblyPosition m_cursorPosition;
+ bool m_cursorPositionHasOffset = false;
+ size_t m_cursorPositionOffset = 0;
+ HighlightTokenState m_highlight;
+ uint64_t m_navByRefTarget;
+ bool m_navByRef = false;
+
+ DisassemblySettingsRef m_settings;
+
+ BinaryNinja::LinearDisassemblyPosition m_topPosition, m_bottomPosition;
+ std::vector<BinaryNinja::LinearDisassemblyLine> m_lines;
+ size_t m_topLine;
+
+ QTimer* m_updateTimer;
+
+ ContextMenuManager m_contextMenuManager;
+ QPointer<CommentDialog> m_commentDialog;
+
+ void adjustSize(int width, int height);
+
+ uint64_t getContiguousOffsetForAddress(uint64_t addr);
+ uint64_t getAddressForContiguousOffset(uint64_t offset);
+
+ void setTopToAddress(uint64_t addr);
+ void refreshLines(size_t lineOffset = 0, bool refreshUIContext = true);
+ bool cachePreviousLines();
+ bool cacheNextLines(size_t& topLineAdjustment);
+ void updateCache();
+ void refreshAtCurrentLocation();
+ bool navigateToAddress(uint64_t addr, bool center, bool updateHighlight, bool navByRef = false);
+
+ void scrollLines(int count);
+
+ void bindActions();
+ void getHexDumpLineBytes(const BinaryNinja::LinearDisassemblyLine& line, size_t& skippedBytes, size_t& totalBytes,
+ size_t& totalCols);
+
+ void setSectionSemantics(const std::string& name, BNSectionSemantics semantics);
+
+private Q_SLOTS:
+ void viewInHexEditor();
+ void viewInGraph();
+ void viewInTypesView(std::string typeName = "");
+ void copyAddressSlot();
+ void goToAddress();
+ void defineNameAtAddr(uint64_t addr);
+ void defineName();
+ void undefineName();
+ void createFunc();
+ void defineFuncName();
+ void undefineFunc();
+ void reanalyze();
+ void comment();
+ void commentAccepted();
+
+ void convertToNop();
+ void alwaysBranch();
+ void invertBranch();
+ void skipAndReturnZero();
+ void skipAndReturnValue();
+
+ void makeInt8();
+ void makeInt16();
+ void makeInt32();
+ void makeInt64();
+ void toggleIntSize();
+ void makePtr();
+ void makeString();
+ void changeType();
+ size_t getStringLength(uint64_t startAddr);
+
+ void displayAsDefault();
+ void displayAsBinary();
+ void displayAsSignedOctal();
+ void displayAsUnsignedOctal();
+ void displayAsSignedDecimal();
+ void displayAsUnsignedDecimal();
+ void displayAsSignedHexadecimal();
+ void displayAsUnsignedHexadecimal();
+ void displayAsCharacterConstant();
+ void displayAsPointer();
+
+ void setInstructionHighlight(BNHighlightColor color);
+ void setBlockHighlight(BNHighlightColor color);
+
+ void scrollBarMoved(int value);
+ void scrollBarAction(int action);
+ void updateTimerEvent();
+
+public:
+ explicit LinearView(BinaryViewRef data, ViewFrame* view);
+ virtual ~LinearView();
+
+ virtual bool canAssemble() override { return true; }
+ virtual bool canCompile() override { return true; }
+
+ virtual BinaryViewRef getData() override { return m_data; }
+ virtual uint64_t getCurrentOffset() override;
+ virtual void getSelectionOffsets(uint64_t& begin, uint64_t& end) override;
+ virtual void getSelectionForInfo(uint64_t& begin, uint64_t& end) override;
+ virtual FunctionRef getCurrentFunction() override;
+ virtual BasicBlockRef getCurrentBasicBlock() override;
+ virtual ArchitectureRef getCurrentArchitecture() override;
+ virtual bool navigate(uint64_t pos) override;
+
+ virtual HistoryEntry* getHistoryEntry() override;
+ virtual void navigateToHistoryEntry(HistoryEntry* entry) override;
+
+ virtual void OnBinaryDataWritten(BinaryNinja::BinaryView* data, uint64_t offset, size_t len) override;
+ virtual void OnBinaryDataInserted(BinaryNinja::BinaryView* data, uint64_t offset, size_t len) override;
+ virtual void OnBinaryDataRemoved(BinaryNinja::BinaryView* data, uint64_t offset, uint64_t len) override;
+ virtual void OnAnalysisFunctionAdded(BinaryNinja::BinaryView* view, BinaryNinja::Function* func) override;
+ virtual void OnAnalysisFunctionRemoved(BinaryNinja::BinaryView* view, BinaryNinja::Function* func) override;
+ virtual void OnAnalysisFunctionUpdated(BinaryNinja::BinaryView* view, BinaryNinja::Function* func) override;
+ virtual void OnDataVariableAdded(BinaryNinja::BinaryView* view, const BinaryNinja::DataVariable& var) override;
+ virtual void OnDataVariableRemoved(BinaryNinja::BinaryView* view, const BinaryNinja::DataVariable& var) override;
+ virtual void OnDataVariableUpdated(BinaryNinja::BinaryView* view, const BinaryNinja::DataVariable& var) override;
+
+ virtual void updateFonts() override;
+
+ virtual StatusBarWidget* getStatusBarWidget() override;
+
+ virtual void followPointer();
+
+ virtual void cut() override;
+ virtual void copy(TransformRef xform = nullptr) override;
+ virtual void paste(TransformRef xform = nullptr) override;
+ virtual void copyAddress() override;
+
+ virtual HighlightTokenState getHighlightTokenState() override { return m_highlight; }
+
+ void toggleOption(BNDisassemblyOption option);
+
+ virtual bool goToReference(FunctionRef func, uint64_t source, uint64_t target) override;
+ QFont getFont() override { return m_render.getFont(); }
+
+ static void registerActions();
+
+protected:
+ virtual void resizeEvent(QResizeEvent* event) override;
+ virtual void paintEvent(QPaintEvent* event) override;
+ virtual void wheelEvent(QWheelEvent* event) override;
+ virtual void mousePressEvent(QMouseEvent* event) override;
+ virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
+};
+
+class LinearViewType: public ViewType
+{
+ static LinearViewType* m_instance;
+
+public:
+ LinearViewType();
+ virtual int getPriority(BinaryViewRef data, const QString& filename) override;
+ virtual QWidget* create(BinaryViewRef data, ViewFrame* viewFrame) override;
+ static void init();
+};