summaryrefslogtreecommitdiff
path: root/ui/addressdialog.h
blob: 173402023bb63c0ca055b11d6ba288beae9a0671 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#pragma once

#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>
#include <QtCore/QStringListModel>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QComboBox>
#include <QtCore/QTimer>
#ifndef BINARYNINJAUI_BINDINGS
	#include <QtCore/QThread>
#endif
#include "binaryninjaapi.h"
#include "uitypes.h"
#include "getsymbolslistthread.h"

/*!

	\defgroup addressdialog AddressDialog
 	\ingroup uiapi
*/

/*!
    \ingroup addressdialog
*/
class BINARYNINJAUIAPI AddressDialogWithPreview : public QDialog
{
	Q_OBJECT

	QComboBox* m_combo;
	QStringListModel* m_model;
	QLabel* m_previewText;
	BinaryViewRef m_view;
	uint64_t m_addr;
	uint64_t m_here;
	QCheckBox* m_checkBox;
	bool m_resultValid;
	QTimer* m_updateTimer;
	QStringList m_historyEntries;
	int m_historySize;
	GetSymbolsListThread* m_updateThread = nullptr;
	QColor m_defaultColor;
	QFont m_defaultFont;
	QString m_prompt;
	bool m_initialTextSelection;
	std::string m_errorString;
	bool m_resultAmbiguous = false;

	void commitHistory();

private Q_SLOTS:
	void updateTimerEvent();
	void accepted();
	void updateRelativeState(Qt::CheckState state);
	void updatePreview();
	void updatePreviewText();
	void updatePreviewWithText(QString data);

public:
	AddressDialogWithPreview(QWidget* parent, BinaryViewRef view, uint64_t here, const QString& title = "Go to Address",
	    const QString& prompt = "Enter Expression", bool defaultToCurrent = false);
	~AddressDialogWithPreview();

	uint64_t getOffset() const { return m_addr; }
};

/*!
    \ingroup addressdialog
*/
class BINARYNINJAUIAPI FileOffsetDialogWithPreview : public QDialog
{
	Q_OBJECT

	QComboBox* m_combo;
	QLabel* m_previewText;
	BinaryViewRef m_view;
	uint64_t m_fileOffset;
	uint64_t m_here;
	bool m_resultValid;
	QTimer* m_updateTimer;
	QStringList m_historyEntries;
	int m_historySize;
	QColor m_defaultColor;
	QFont m_defaultFont;
	QString m_prompt;
	bool m_initialTextSelection;
	std::string m_errorString;
	bool m_resultAmbiguous = false;

	void commitHistory();

private Q_SLOTS:
	void updateTimerEvent();
	void accepted();
	void updatePreview();
	void updatePreviewText();
	void updatePreview(QString data);

public:
	FileOffsetDialogWithPreview(QWidget* parent, BinaryViewRef view, uint64_t here,
	    const QString& title = "Go to File Offset", const QString& prompt = "Enter Expression",
	    bool defaultToCurrent = false);
	~FileOffsetDialogWithPreview() {}

	uint64_t getOffset() const { return m_fileOffset; }
};

/*!
    \ingroup addressdialog
*/
class BINARYNINJAUIAPI AddUserXrefDialog : public QDialog
{
	Q_OBJECT

	QComboBox* m_combo;
	QStringListModel* m_model;
	QLabel *m_previewText, m_sizePrompt;
	QLineEdit* m_sizeInput;
	BinaryViewRef m_view;
	uint64_t m_addr;
	uint64_t m_here;
	size_t m_size;
	bool m_resultValid;
	QTimer* m_updateTimer;
	QStringList m_historyEntries;
	int m_historySize;
	GetSymbolsListThread* m_updateThread = nullptr;
	QColor m_defaultColor;
	QFont m_defaultFont;
	QString m_prompt;
	bool m_initialTextSelection;
	std::string m_errorString;
	bool m_resultAmbiguous = false;

	void commitHistory();

private Q_SLOTS:
	void updateTimerEvent();
	void accepted();
	void updatePreview();
	void updatePreviewText();
	void updatePreviewWithText(QString data);

public:
	AddUserXrefDialog(QWidget* parent, BinaryViewRef view, uint64_t here = 0, size_t size = 0,
	    const QString& title = "Add User Type Field Cross Reference",
	    const QString& sizeTitle = "Size of Reference (optional)", const QString& prompt = "Enter Expression",
	    bool defaultToCurrent = false);
	~AddUserXrefDialog();

	uint64_t getOffset() const { return m_addr; }
	size_t getSize() const { return m_size; }
};